]> git.sesse.net Git - vlc/blobdiff - modules/gui/gtk/gtk.c
* Fix the play/pause button status
[vlc] / modules / gui / gtk / gtk.c
index 832db714923b4a78a9ac11e556ab8b716bbd738e..10e0114b5215fbdf79de971d0fd44c1bd0b89921 100644 (file)
@@ -2,7 +2,7 @@
  * gtk.c : Gtk+ plugin for vlc
  *****************************************************************************
  * Copyright (C) 2000-2001 VideoLAN
- * $Id: gtk.c,v 1.7 2002/11/12 11:45:27 gbazin Exp $
+ * $Id$
  *
  * Authors: Samuel Hocevar <sam@zoy.org>
  *
@@ -10,7 +10,7 @@
  * 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
@@ -54,27 +54,34 @@ static int  Manage       ( intf_thread_t * );
 /*****************************************************************************
  * Module descriptor
  *****************************************************************************/
-#define TOOLTIPS_TEXT N_("show tooltips")
+#define TOOLTIPS_TEXT N_("Show tooltips")
 #define TOOLTIPS_LONGTEXT N_("Show tooltips for configuration options.")
 
-#define PREFS_MAXH_TEXT N_("maximum height for the configuration windows")
+#define PREFS_MAXH_TEXT N_("Maximum height for the configuration windows")
 #define PREFS_MAXH_LONGTEXT N_( \
     "You can set the maximum height that the configuration windows in the " \
     "preferences menu will occupy.")
 
+#define PATH_TEXT N_("Interface default search path")
+#define PATH_LONGTEXT N_( \
+    "This option allows you to set the default path that the interface will " \
+    "open when looking for a file.")
+
 vlc_module_begin();
 #ifdef WIN32
     int i = 90;
 #else
     int i = getenv( "DISPLAY" ) == NULL ? 10 : 90;
 #endif
-    add_category_hint( N_("Gtk+"), NULL );
+    set_description( _("Gtk+ interface") );
+
     add_bool( "gtk-tooltips", 1, E_(GtkHideTooltips),
-              TOOLTIPS_TEXT, TOOLTIPS_LONGTEXT );
+              TOOLTIPS_TEXT, TOOLTIPS_LONGTEXT, VLC_FALSE );
     add_integer( "gtk-prefs-maxh", 480, NULL,
-                 PREFS_MAXH_TEXT, PREFS_MAXH_LONGTEXT );
+                 PREFS_MAXH_TEXT, PREFS_MAXH_LONGTEXT, VLC_TRUE );
+    add_directory( "gtk-search-path", NULL, NULL, PATH_TEXT,
+                   PATH_LONGTEXT, VLC_TRUE );
 
-    set_description( _("Gtk+ interface module") );
     set_capability( "interface", i );
     set_callbacks( Open, Close );
     add_shortcut( "gtk" );
@@ -97,7 +104,8 @@ static int Open( vlc_object_t *p_this )
     }
 
 #ifdef NEED_GTK_MAIN
-    p_intf->p_sys->p_gtk_main = module_Need( p_this, "gtk_main", "gtk" );
+    p_intf->p_sys->p_gtk_main =
+        module_Need( p_this, "gui-helper", "gtk", VLC_TRUE );
     if( p_intf->p_sys->p_gtk_main == NULL )
     {
         free( p_intf->p_sys );
@@ -110,16 +118,27 @@ static int Open( vlc_object_t *p_this )
     p_intf->p_sys->p_sub = msg_Subscribe( p_intf );
 
     /* Initialize Gtk+ thread */
-    p_intf->p_sys->b_playing = 0;
-    p_intf->p_sys->b_popup_changed = 0;
-    p_intf->p_sys->b_window_changed = 0;
-    p_intf->p_sys->b_playlist_changed = 0;
+    p_intf->p_sys->b_playing = VLC_FALSE;
+    p_intf->p_sys->b_deinterlace_update = VLC_FALSE;
+
+    p_intf->p_sys->b_aout_update = VLC_FALSE;
+    p_intf->p_sys->b_vout_update = VLC_FALSE;
+
+    p_intf->p_sys->b_popup_changed = VLC_FALSE;
+    p_intf->p_sys->b_window_changed = VLC_FALSE;
+    p_intf->p_sys->b_playlist_changed = VLC_FALSE;
+    p_intf->p_sys->b_program_update = VLC_FALSE;
+    p_intf->p_sys->b_title_update = VLC_FALSE;
+    p_intf->p_sys->b_chapter_update = VLC_FALSE;
+    p_intf->p_sys->b_spu_update = VLC_FALSE;
+    p_intf->p_sys->b_audio_update = VLC_FALSE;
 
     p_intf->p_sys->p_input = NULL;
     p_intf->p_sys->i_playing = -1;
-    p_intf->p_sys->b_slider_free = 1;
+    p_intf->p_sys->b_slider_free = VLC_TRUE;
 
     p_intf->p_sys->i_part = 0;
+    p_intf->p_sys->b_mute = VLC_FALSE;
 
     return VLC_SUCCESS;
 }
@@ -161,13 +180,15 @@ static void Run( intf_thread_t *p_intf )
         { "text/uri-list", 0, DROP_ACCEPT_TEXT_URI_LIST },
         { "text/plain", 0, DROP_ACCEPT_TEXT_PLAIN }
     };
+    char *psz_sout;
+    GString *       p_target;
 
 #ifdef NEED_GTK_MAIN
     gdk_threads_enter();
 #else
     /* gtk_init needs to know the command line. We don't care, so we
      * give it an empty one */
-    char  *p_args[] = { "" };
+    char  *p_args[] = { "", NULL };
     char **pp_args  = p_args;
     int    i_args   = 1;
     int    i_dummy;
@@ -181,6 +202,7 @@ static void Run( intf_thread_t *p_intf )
     p_intf->p_sys->p_playwin = create_intf_playlist();
     p_intf->p_sys->p_messages = create_intf_messages();
     p_intf->p_sys->p_tooltips = gtk_tooltips_new();
+    p_intf->p_sys->p_sout = create_intf_sout();
 
     /* Set the title of the main window */
     gtk_window_set_title( GTK_WINDOW(p_intf->p_sys->p_window),
@@ -189,13 +211,13 @@ static void Run( intf_thread_t *p_intf )
     /* Accept file drops on the main window */
     gtk_drag_dest_set( GTK_WIDGET( p_intf->p_sys->p_window ),
                        GTK_DEST_DEFAULT_ALL, target_table,
-                       1, GDK_ACTION_COPY );
+                       DROP_ACCEPT_END, GDK_ACTION_COPY );
 
     /* Accept file drops on the playlist window */
     gtk_drag_dest_set( GTK_WIDGET( lookup_widget( p_intf->p_sys->p_playwin,
                                    "playlist_clist") ),
                        GTK_DEST_DEFAULT_ALL, target_table,
-                       1, GDK_ACTION_COPY );
+                       DROP_ACCEPT_END, GDK_ACTION_COPY );
 
     /* Get the slider object */
     p_intf->p_sys->p_slider_frame = GTK_FRAME( gtk_object_get_data(
@@ -224,6 +246,8 @@ static void Run( intf_thread_t *p_intf )
     p_intf->p_sys->f_adj_oldvalue = 0;
 #undef P_SLIDER
 
+
+
     /* We don't create these ones yet because we perhaps won't need them */
     p_intf->p_sys->p_about = NULL;
     p_intf->p_sys->p_modules = NULL;
@@ -242,6 +266,12 @@ static void Run( intf_thread_t *p_intf )
 
     gtk_object_set_data( GTK_OBJECT(p_intf->p_sys->p_popup),
                          "p_intf", p_intf );
+    gtk_object_set_data( GTK_OBJECT( gtk_object_get_data(
+                             GTK_OBJECT(p_intf->p_sys->p_popup),
+                             "popup_audio" ) ), "p_intf", p_intf );
+    gtk_object_set_data( GTK_OBJECT( gtk_object_get_data(
+                             GTK_OBJECT(p_intf->p_sys->p_popup),
+                             "popup_video" ) ), "p_intf", p_intf );
 
     gtk_object_set_data( GTK_OBJECT( p_intf->p_sys->p_playwin ),
                          "p_intf", p_intf );
@@ -251,6 +281,22 @@ static void Run( intf_thread_t *p_intf )
 
     gtk_object_set_data( GTK_OBJECT(p_intf->p_sys->p_adj),
                          "p_intf", p_intf );
+    gtk_object_set_data( GTK_OBJECT( p_intf->p_sys->p_sout ),
+                         "p_intf", p_intf );
+
+    psz_sout = config_GetPsz( p_intf, "sout" );
+    p_target = g_string_new( psz_sout ? psz_sout : "" );
+    if( psz_sout ) free( psz_sout );
+
+    gtk_entry_set_text( gtk_object_get_data( GTK_OBJECT( p_intf->p_sys->p_sout ), "sout_entry_target" ), p_target->str );
+    g_string_free( p_target, TRUE );
+
+    /* FIXME it's to be sure that only file entry is selected */
+    gtk_toggle_button_set_active(  gtk_object_get_data( GTK_OBJECT( p_intf->p_sys->p_sout ),
+                                   "sout_access_udp" ), TRUE );
+
+    gtk_toggle_button_set_active(  gtk_object_get_data( GTK_OBJECT( p_intf->p_sys->p_sout ),
+                                   "sout_access_file" ), TRUE );
 
     /* Show the control window */
     gtk_widget_show( p_intf->p_sys->p_window );
@@ -357,6 +403,15 @@ static int Manage( intf_thread_t *p_intf )
         p_intf->p_sys->p_sub->i_start = i_start;
         vlc_mutex_unlock( p_intf->p_sys->p_sub->p_lock );
 
+        /* If the messages list becomes too big, just clean half of it. */
+        if( gtk_text_get_length( p_intf->p_sys->p_messages_text ) >
+            VLC_MSG_QSIZE * 1000 )
+        {
+            gtk_text_set_point( p_intf->p_sys->p_messages_text, 0 );
+            gtk_text_forward_delete( p_intf->p_sys->p_messages_text,
+                gtk_text_get_length( p_intf->p_sys->p_messages_text ) / 2 );
+        }
+
         gtk_text_set_point( p_intf->p_sys->p_messages_text,
                     gtk_text_get_length( p_intf->p_sys->p_messages_text ) );
     }
@@ -378,7 +433,10 @@ static int Manage( intf_thread_t *p_intf )
 
     if( p_intf->p_sys->p_input )
     {
-        input_thread_t *p_input = p_intf->p_sys->p_input;
+        input_thread_t  *p_input = p_intf->p_sys->p_input;
+        aout_instance_t *p_aout  = NULL;
+        vout_thread_t   *p_vout  = NULL;
+        vlc_bool_t      b_need_menus = VLC_FALSE;
 
         vlc_mutex_lock( &p_input->stream.stream_lock );
 
@@ -411,15 +469,20 @@ static int Manage( intf_thread_t *p_intf )
                                              "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 )
+                 * finished dragging the slider.
+                 * Beware, the hack below is needed by the dvdplay plugin! */
+                else if( p_intf->p_sys->b_slider_free
+                /* hack -> */ && (p_intf->p_sys->f_adj_oldvalue < 100.) )
                 {
-                    off_t i_seek = ( newvalue * p_area->i_size ) / 100;
+                    if( newvalue >= 0. && newvalue < 100. )
+                    {
+                        double f_fpos = (double)newvalue / 100.0;
 
-                    /* 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 );
+                        /* release the lock to be able to seek */
+                        vlc_mutex_unlock( &p_input->stream.stream_lock );
+                        var_SetFloat( p_input, "position", f_fpos );
+                        vlc_mutex_lock( &p_input->stream.stream_lock );
+                    }
 
                     /* Update the old value */
                     p_intf->p_sys->f_adj_oldvalue = newvalue;
@@ -431,6 +494,42 @@ static int Manage( intf_thread_t *p_intf )
                 p_input->stream.p_selected_area->i_part )
             {
                 p_intf->p_sys->b_chapter_update = 1;
+                b_need_menus = VLC_TRUE;
+            }
+
+            /* Does the audio output require to update the menus ? */
+            p_aout = (aout_instance_t *)vlc_object_find( p_intf, VLC_OBJECT_AOUT,
+                                                         FIND_ANYWHERE );
+            if( p_aout != NULL )
+            {
+                vlc_value_t val;
+                if( var_Get( (vlc_object_t *)p_aout, "intf-change", &val ) >= 0
+                    && val.b_bool )
+                {
+                    p_intf->p_sys->b_aout_update = 1;
+                    b_need_menus = 1;
+                }
+
+                vlc_object_release( (vlc_object_t *)p_aout );
+            }
+
+            /* Does the video output require to update the menus ? */
+            p_vout = (vout_thread_t *)vlc_object_find( p_intf, VLC_OBJECT_VOUT,
+                                                       FIND_ANYWHERE );
+            if( p_vout != NULL ) 
+            {
+                vlc_value_t val;
+                if( var_Get( (vlc_object_t *)p_vout, "intf-change", &val ) >= 0
+                    && val.b_bool )
+                {
+                    p_intf->p_sys->b_vout_update = 1;
+                    b_need_menus = 1;
+                }
+
+                vlc_object_release( (vlc_object_t *)p_vout );
+            }
+            if( b_need_menus )
+            {
                 GtkSetupMenus( p_intf );
             }
         }