]> git.sesse.net Git - vlc/blob - modules/gui/gtk/open.c
* Coding style cleanup: removed tabs and trailing spaces.
[vlc] / modules / gui / gtk / open.c
1 /*****************************************************************************
2  * gtk_open.c : functions to handle file/disc/network open widgets.
3  *****************************************************************************
4  * Copyright (C) 2000, 2001, 2003 VideoLAN
5  * $Id: open.c,v 1.22 2003/12/22 14:32:56 sam Exp $
6  *
7  * Authors: Sam Hocevar <sam@zoy.org>
8  *          Stéphane Borel <stef@via.ecp.fr>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
23  *****************************************************************************/
24
25 /*****************************************************************************
26  * Preamble
27  *****************************************************************************/
28 #include <sys/types.h>                                              /* off_t */
29 #include <stdlib.h>
30
31 #include <vlc/vlc.h>
32 #include <vlc/intf.h>
33
34 #ifdef MODULE_NAME_IS_gnome
35 #   include <gnome.h>
36 #else
37 #   include <gtk/gtk.h>
38 #endif
39
40 #include <string.h>
41
42 #include "gtk_callbacks.h"
43 #include "gtk_interface.h"
44 #include "gtk_support.h"
45
46 #include "playlist.h"
47 #include "common.h"
48
49 #ifdef HAVE_CDDAX
50 #define CDDA_MRL "cddax://"
51 #else
52 #define CDDA_MRL "cdda://"
53 #endif
54
55 #ifdef HAVE_VCDX
56 #define VCD_MRL "vcdx://"
57 #else
58 #define VCD_MRL "vcdx://"
59 #endif
60
61 static void GtkOpenShow( intf_thread_t *, int );
62
63 static void GtkFileOpenChanged    ( GtkWidget *, gpointer );
64 static void GtkDiscOpenChanged    ( GtkWidget *, gpointer );
65 static void GtkNetworkOpenChanged ( GtkWidget *, gpointer );
66 static void GtkSatOpenChanged     ( GtkWidget *, gpointer );
67
68 /*****************************************************************************
69  * File requester callbacks
70  *****************************************************************************
71  * The following callbacks are related to the file requester.
72  *****************************************************************************/
73 void GtkFileShow( GtkButton * button, gpointer user_data )
74 {
75     GtkWidget * p_file = create_intf_file();
76
77     gtk_object_set_data( GTK_OBJECT(p_file), "p_intf",
78                          GtkGetIntf( button ) );
79
80     /* entry <- entry_file or entry_subtitle */
81     gtk_object_set_data( GTK_OBJECT(p_file), "entry",
82                          user_data );
83
84     gtk_widget_show( p_file );
85     gdk_window_raise( p_file->window );
86 }
87
88 void GtkFileOk( GtkButton * button, gpointer user_data )
89 {
90     GtkWidget * p_file = gtk_widget_get_toplevel( GTK_WIDGET (button) );
91
92     char *psz_entry;
93     char *psz_filename;
94     intf_thread_t * p_intf = GtkGetIntf( button );
95
96     /* add the new file to the dialog box */
97     psz_entry = gtk_object_get_data( GTK_OBJECT( p_file ), "entry" );
98     psz_filename =
99             gtk_file_selection_get_filename( GTK_FILE_SELECTION( p_file ) );
100     gtk_entry_set_text( GTK_ENTRY( lookup_widget( p_intf->p_sys->p_open,
101                                                   psz_entry ) ),
102                         psz_filename );
103     gtk_widget_destroy( p_file );
104 }
105
106 void GtkFileCancel( GtkButton * button, gpointer user_data )
107 {
108     gtk_widget_destroy( gtk_widget_get_toplevel( GTK_WIDGET (button) ) );
109 }
110
111 /*****************************************************************************
112  * Open file callbacks
113  *****************************************************************************
114  * The following callbacks are related to the file tab.
115  *****************************************************************************/
116 gboolean GtkFileOpenShow( GtkWidget       *widget,
117                           gpointer         user_data )
118 {
119     GtkOpenShow( GtkGetIntf( widget ), 0 );
120
121     return TRUE;
122 }
123
124 static void GtkFileOpenChanged( GtkWidget * button, gpointer user_data )
125 {
126     GString *       p_target;
127
128     p_target = g_string_new( "file://" );
129     g_string_append( p_target,
130                      gtk_entry_get_text( GTK_ENTRY( lookup_widget(
131                                      GTK_WIDGET(button), "entry_file" ) ) ) );
132     gtk_entry_set_text( GTK_ENTRY( lookup_widget(
133                                    GTK_WIDGET(button), "entry_open" ) ),
134                         p_target->str );
135     g_string_free( p_target, TRUE );
136 }
137
138 /*****************************************************************************
139  * Open disc callbacks
140  *****************************************************************************
141  * The following callbacks are related to the disc manager.
142  *****************************************************************************/
143 gboolean GtkDiscOpenShow( GtkWidget       *widget,
144                           gpointer         user_data)
145 {
146     GtkOpenShow( GtkGetIntf( widget ), 1 );
147
148     return TRUE;
149 }
150
151 void GtkDiscOpenDvd( GtkToggleButton * togglebutton, gpointer user_data )
152 {
153     intf_thread_t * p_intf = GtkGetIntf( togglebutton );
154     char *psz_device;
155
156     if( togglebutton->active )
157     {
158         if ( (psz_device = config_GetPsz( p_intf, "dvd" )) )
159         {
160            gtk_widget_set_sensitive( GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( p_intf->p_sys->p_open ), "disc_dvd_use_menu" ) ) , TRUE);
161
162            gtk_entry_set_text(
163             GTK_ENTRY( lookup_widget( GTK_WIDGET(togglebutton),
164                                       "disc_name" ) ), psz_device );
165            free( psz_device );
166         }
167         else
168         {
169           gtk_widget_set_sensitive( GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( p_intf->p_sys->p_open ), "disc_dvd_use_menu" ) ), FALSE );
170         }
171         GtkDiscOpenChanged( (GtkWidget *) togglebutton, user_data );
172     }
173     else
174     {
175         gtk_widget_set_sensitive( GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( p_intf->p_sys->p_open ), "disc_dvd_use_menu" ) ), FALSE );
176     }
177 }
178
179 void GtkDiscOpenVcd( GtkToggleButton * togglebutton, gpointer user_data )
180 {
181     intf_thread_t * p_intf = GtkGetIntf( togglebutton );
182     char *psz_device;
183
184     if( togglebutton->active )
185       {
186         if ( (psz_device = config_GetPsz( p_intf, "vcd" )) )
187          {
188            gtk_entry_set_text(
189             GTK_ENTRY( lookup_widget( GTK_WIDGET(togglebutton),
190                                       "disc_name" ) ), psz_device );
191            free( psz_device );
192          } else {
193             gtk_entry_set_text(
194             GTK_ENTRY( lookup_widget( GTK_WIDGET(togglebutton),
195                                       "disc_name" ) ), "" );
196          }
197         GtkDiscOpenChanged( (GtkWidget *) togglebutton, user_data );
198       }
199 }
200
201 void GtkDiscOpenCDDA( GtkToggleButton * togglebutton, gpointer user_data )
202 {
203     intf_thread_t * p_intf = GtkGetIntf( togglebutton );
204     char *psz_device;
205
206     if( togglebutton->active )
207       {
208         if ( (psz_device = config_GetPsz( p_intf, "cd-audio" )) )
209         {
210           gtk_entry_set_text(
211             GTK_ENTRY( lookup_widget( GTK_WIDGET(togglebutton),
212                                       "disc_name" ) ), psz_device );
213           free( psz_device );
214         } else {
215           gtk_entry_set_text(
216             GTK_ENTRY( lookup_widget( GTK_WIDGET(togglebutton),
217                                       "disc_name" ) ), "" );
218         }
219         GtkDiscOpenChanged( (GtkWidget *) togglebutton, user_data );
220       }
221 }
222
223 static void GtkDiscOpenChanged( GtkWidget * button, gpointer user_data )
224 {
225     intf_thread_t * p_intf = GtkGetIntf( button );
226     GString * p_target = g_string_new( "" );
227     GtkWidget * p_open = gtk_widget_get_toplevel( GTK_WIDGET (button) );
228     vlc_bool_t b_menus = VLC_FALSE;
229     vlc_bool_t b_chapter_menu = VLC_TRUE;
230     GtkWidget *p_label = gtk_object_get_data( GTK_OBJECT( p_open ),
231                                               "disc_title_label" );
232
233     if( GTK_TOGGLE_BUTTON( lookup_widget( GTK_WIDGET(button),
234                                           "disc_dvd" ) )->active )
235     {
236         gtk_label_set_text( GTK_LABEL( p_label ), _("Title") );
237
238         b_menus = GTK_TOGGLE_BUTTON( lookup_widget( GTK_WIDGET(button),
239                                                "disc_dvd_use_menu" ) )->active;
240
241         if( b_menus )
242         {
243             g_string_append( p_target, "dvd://" );
244         }
245         else
246         {
247             g_string_append( p_target, "dvdsimple://" );
248         }
249
250         g_string_append( p_target,
251                          gtk_entry_get_text( GTK_ENTRY( lookup_widget(
252                                      GTK_WIDGET(button), "disc_name" ) ) ) );
253
254         if( !b_menus )
255           {
256             g_string_sprintfa( p_target, "@%i:%i",
257                                gtk_spin_button_get_value_as_int(
258                                 GTK_SPIN_BUTTON( lookup_widget(
259                                     GTK_WIDGET(button), "disc_title" ) ) ),
260                                gtk_spin_button_get_value_as_int(
261                                 GTK_SPIN_BUTTON( lookup_widget(
262                                     GTK_WIDGET(button), "disc_chapter" ) ) ) );
263           }
264     }
265     else if( GTK_TOGGLE_BUTTON( lookup_widget( GTK_WIDGET(button),
266                                                "disc_vcd" ) )->active )
267     {
268         int i = gtk_spin_button_get_value_as_int(
269                            GTK_SPIN_BUTTON( lookup_widget(
270                            GTK_WIDGET(button), "disc_title" ) ) );
271
272 #ifdef HAVE_VCDX
273         int i_pbc = config_GetInt( p_intf, "vcdx-PBC"  );
274
275         gtk_label_set_text( GTK_LABEL( p_label ),
276                             i_pbc ? _("PBC LID") : _("Entry") );
277
278         g_string_append( p_target, VCD_MRL );
279         g_string_append( p_target,
280                          gtk_entry_get_text( GTK_ENTRY( lookup_widget(
281                          GTK_WIDGET(button), "disc_name" ) ) ) );
282
283         if ( i )
284           g_string_sprintfa( p_target, "@%c%d", i_pbc ? 'P' : 'E', i );
285
286 #else
287         gtk_label_set_text( GTK_LABEL( p_label ), _("Track") );
288         g_string_append( p_target, VCD_MRL );
289         g_string_sprintfa( p_target, "@%d", i );
290 #endif /* HAVE_VCDX */
291         b_chapter_menu = VLC_FALSE;
292     }
293
294     else if( GTK_TOGGLE_BUTTON( lookup_widget( GTK_WIDGET(button),
295                                                "disc_cdda" ) )->active )
296     {
297         int i = gtk_spin_button_get_value_as_int(
298                            GTK_SPIN_BUTTON( lookup_widget(
299                            GTK_WIDGET(button), "disc_title" ) ) );
300
301         gtk_label_set_text( GTK_LABEL( p_label ), _("Track") );
302         b_chapter_menu = VLC_FALSE;
303
304         g_string_append( p_target, CDDA_MRL );
305         g_string_append( p_target,
306                      gtk_entry_get_text( GTK_ENTRY( lookup_widget(
307                                      GTK_WIDGET(button), "disc_name" ) ) ) );
308 #ifdef HAVE_CDDAX
309         if ( i )
310           g_string_sprintfa( p_target, "@T%i", i );
311 #else
312         g_string_sprintfa( p_target, "@%i", i );
313
314 #endif
315     }
316
317     gtk_widget_set_sensitive( gtk_object_get_data( GTK_OBJECT( p_open ),
318                     "disc_title_label" ), !b_menus );
319     gtk_widget_set_sensitive( gtk_object_get_data( GTK_OBJECT( p_open ),
320                     "disc_title" ), !b_menus );
321     gtk_widget_set_sensitive( gtk_object_get_data( GTK_OBJECT( p_open ),
322                     "disc_chapter_label" ), b_chapter_menu && !b_menus );
323     gtk_widget_set_sensitive( gtk_object_get_data( GTK_OBJECT( p_open ),
324                     "disc_chapter" ), b_chapter_menu && !b_menus );
325
326     gtk_entry_set_text( GTK_ENTRY( lookup_widget(
327                                    GTK_WIDGET(button), "entry_open" ) ),
328                         p_target->str );
329     g_string_free( p_target, TRUE );
330 }
331
332 /*****************************************************************************
333  * Network stream callbacks
334  *****************************************************************************
335  * The following callbacks are related to the network stream manager.
336  *****************************************************************************/
337 gboolean GtkNetworkOpenShow( GtkWidget       *widget,
338                              gpointer         user_data )
339 {
340     GtkOpenShow( GtkGetIntf( widget ), 2 );
341
342     return TRUE;
343 }
344
345 static void GtkNetworkOpenChanged( GtkWidget *button, gpointer user_data )
346 {
347     GString *       p_target = g_string_new( "" );
348
349     unsigned int    i_port;
350
351 #define SELECTED( s ) GTK_TOGGLE_BUTTON( lookup_widget( GTK_WIDGET(button), \
352                        (s) ) )->active
353     /* Check which option was chosen */
354     if( SELECTED( "network_udp" ) )
355     {
356         g_string_append( p_target, "udp://" );
357         i_port = gtk_spin_button_get_value_as_int( GTK_SPIN_BUTTON(
358                                lookup_widget( GTK_WIDGET(button),
359                                               "network_udp_port" ) ) );
360         if( i_port != 1234 )
361         {
362             g_string_sprintfa( p_target, "@:%i", i_port );
363         }
364     }
365     else if( SELECTED( "network_multicast" ) )
366     {
367         g_string_sprintfa( p_target, "udp://@%s",
368                            gtk_entry_get_text( GTK_ENTRY(
369                             lookup_widget( GTK_WIDGET(button),
370                                            "network_multicast_address" ) ) ) );
371         i_port = gtk_spin_button_get_value_as_int( GTK_SPIN_BUTTON(
372                                lookup_widget( GTK_WIDGET(button),
373                                               "network_multicast_port" ) ) );
374         if( i_port != 1234 )
375         {
376             g_string_sprintfa( p_target, ":%i", i_port );
377         }
378     }
379     else if( SELECTED( "network_http" ) )
380     {
381         g_string_assign( p_target,
382                          gtk_entry_get_text( GTK_ENTRY( lookup_widget(
383                                GTK_WIDGET(button), "network_http_url" ) ) ) );
384     }
385
386     gtk_entry_set_text( GTK_ENTRY( lookup_widget(
387                                    GTK_WIDGET(button), "entry_open" ) ),
388                         p_target->str );
389     g_string_free( p_target, TRUE );
390 }
391
392 void GtkNetworkOpenUDP( GtkToggleButton *togglebutton,
393                                         gpointer user_data )
394 {
395     GtkWidget *     p_open;
396
397     p_open = gtk_widget_get_toplevel( GTK_WIDGET (togglebutton) );
398
399     gtk_widget_set_sensitive( gtk_object_get_data( GTK_OBJECT( p_open ),
400                     "network_udp_port_label" ),
401                     gtk_toggle_button_get_active( togglebutton ) );
402     gtk_widget_set_sensitive( gtk_object_get_data( GTK_OBJECT( p_open ),
403                     "network_udp_port" ),
404                     gtk_toggle_button_get_active( togglebutton ) );
405
406     GtkNetworkOpenChanged( GTK_WIDGET( togglebutton ), user_data );
407 }
408
409 void GtkNetworkOpenMulticast( GtkToggleButton *togglebutton,
410                                               gpointer user_data )
411 {
412     GtkWidget *     p_open;
413
414     p_open = gtk_widget_get_toplevel( GTK_WIDGET (togglebutton) );
415     gtk_widget_set_sensitive( gtk_object_get_data( GTK_OBJECT( p_open ),
416                     "network_multicast_address_label" ),
417                     gtk_toggle_button_get_active( togglebutton ) );
418     gtk_widget_set_sensitive( gtk_object_get_data( GTK_OBJECT( p_open ),
419                     "network_multicast_address_combo" ),
420                     gtk_toggle_button_get_active( togglebutton ) );
421
422     gtk_widget_set_sensitive( gtk_object_get_data( GTK_OBJECT( p_open ),
423                     "network_multicast_port_label" ),
424                     gtk_toggle_button_get_active( togglebutton ) );
425     gtk_widget_set_sensitive( gtk_object_get_data( GTK_OBJECT( p_open ),
426                     "network_multicast_port" ),
427                     gtk_toggle_button_get_active( togglebutton ) );
428
429     GtkNetworkOpenChanged( GTK_WIDGET( togglebutton ), user_data );
430 }
431
432 void GtkNetworkOpenHTTP( GtkToggleButton *togglebutton,
433                                          gpointer user_data )
434 {
435     GtkWidget *     p_open;
436
437     p_open = gtk_widget_get_toplevel( GTK_WIDGET (togglebutton) );
438     gtk_widget_set_sensitive( gtk_object_get_data( GTK_OBJECT( p_open ),
439                     "network_http_url_label" ),
440                     gtk_toggle_button_get_active( togglebutton ) );
441     gtk_widget_set_sensitive( gtk_object_get_data( GTK_OBJECT( p_open ),
442                     "network_http_url" ),
443                     gtk_toggle_button_get_active( togglebutton ) );
444
445     GtkNetworkOpenChanged( GTK_WIDGET( togglebutton ), user_data );
446 }
447
448 /*****************************************************************************
449  * Open satellite callbacks
450  *****************************************************************************
451  * The following callbacks are related to the satellite card manager.
452  *****************************************************************************/
453 gboolean GtkSatOpenShow( GtkWidget       *widget,
454                          gpointer         user_data)
455 {
456     GtkOpenShow( GtkGetIntf( widget ), 3 );
457
458     return TRUE;
459 }
460
461 static void GtkSatOpenChanged( GtkWidget * button, gpointer user_data )
462 {
463     GString *       p_target = g_string_new( "" );
464
465     g_string_sprintfa( p_target, "%s://%d,%d,%ld,%d", "satellite",
466                        gtk_spin_button_get_value_as_int(
467                               GTK_SPIN_BUTTON( lookup_widget(
468                                   GTK_WIDGET(button), "sat_freq" ) ) ),
469                        !GTK_TOGGLE_BUTTON( lookup_widget( GTK_WIDGET( button ),
470                                                "sat_pol_vert" ) )->active,
471                        strtol( gtk_entry_get_text( GTK_ENTRY( GTK_COMBO(
472                                lookup_widget( GTK_WIDGET( button ), "sat_fec" )
473                                )->entry ) ), NULL, 10 ),
474                        gtk_spin_button_get_value_as_int(
475                               GTK_SPIN_BUTTON( lookup_widget(
476                                   GTK_WIDGET(button), "sat_srate" ) ) ) );
477
478     gtk_entry_set_text( GTK_ENTRY( lookup_widget(
479                                    GTK_WIDGET(button), "entry_open" ) ),
480                         p_target->str );
481     g_string_free( p_target, TRUE );
482 }
483
484 void
485 GtkSatOpenToggle                       (GtkToggleButton *togglebutton,
486                                         gpointer         user_data)
487 {
488     if( togglebutton->active )
489     {
490         GtkSatOpenChanged( GTK_WIDGET( togglebutton ), user_data );
491     }
492 }
493
494 /*****************************************************************************
495  * Open subtitle callbacks
496  *****************************************************************************
497  * The following callbacks are related to the subtitle
498  *****************************************************************************/
499 void
500 GtkOpenSubtitleShow                    (GtkButton       *button,
501                                         gpointer         user_data)
502 {
503     intf_thread_t * p_intf = GtkGetIntf( button );
504
505     if( GTK_TOGGLE_BUTTON( button )->active )
506     {
507         /* show hbox_subtitle */
508         gtk_widget_show_all( GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( p_intf->p_sys->p_open ), "hbox_subtitle" ) ) );
509     }
510     else
511     {
512         /* hide hbox_subtitle */
513         gtk_widget_hide_all( GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( p_intf->p_sys->p_open ), "hbox_subtitle" ) ) );
514     }
515 }
516
517 /*****************************************************************************
518  * Open sout callbacks
519  *****************************************************************************
520  * The following callbacks are related to the sout
521  *****************************************************************************/
522
523 void GtkOpenSoutShow  ( GtkButton       *button,
524                         gpointer         user_data)
525 {
526     intf_thread_t * p_intf = GtkGetIntf( button );
527
528     if( GTK_TOGGLE_BUTTON( button )->active )
529     {
530         gtk_widget_set_sensitive( GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( p_intf->p_sys->p_open ), "sout_settings" ) ), TRUE );
531     }
532     else
533     {
534         gtk_widget_set_sensitive( GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( p_intf->p_sys->p_open ), "sout_settings" ) ), FALSE );
535     }
536
537 }
538
539 /******************************
540   ******************************/
541
542 static void GtkOpenShow( intf_thread_t *p_intf, int i_page )
543 {
544     char *psz_var;
545     GtkWidget *p_notebook;
546
547     /* If we have already created this window, do nothing */
548     if( GTK_IS_WIDGET( p_intf->p_sys->p_open ) )
549     {
550         goto setpage;
551     }
552
553     p_intf->p_sys->p_open = create_intf_open();
554     gtk_object_set_data( GTK_OBJECT( p_intf->p_sys->p_open ),
555                          "p_intf", p_intf );
556
557     /* FileOpen stuff */
558     psz_var = config_GetPsz( p_intf, "search-path" );
559     if( psz_var )
560     {
561         gtk_file_selection_set_filename( GTK_FILE_SELECTION(
562             p_intf->p_sys->p_open ), psz_var );
563         free( psz_var );
564     }
565
566     /* Disc stuff */
567     psz_var = config_GetPsz( p_intf, "dvd" );
568     if( psz_var )
569     {
570         gtk_entry_set_text( GTK_ENTRY( gtk_object_get_data(
571             GTK_OBJECT( p_intf->p_sys->p_open ), "disc_name" ) ),
572             psz_var );
573         free( psz_var );
574     }
575
576     /* Network stuff */
577     gtk_spin_button_set_value( GTK_SPIN_BUTTON( gtk_object_get_data(
578         GTK_OBJECT( p_intf->p_sys->p_open ), "network_udp_port" ) ),
579         config_GetInt( p_intf, "server-port" ) );
580
581     gtk_entry_set_text( GTK_ENTRY( gtk_object_get_data(
582         GTK_OBJECT( p_intf->p_sys->p_open ), "network_http_url" ) ),
583         "http://" );
584
585 #ifdef HAVE_SATELLITE
586     /* Satellite stuff */
587     psz_var = config_GetPsz( p_intf, "frequency" );
588     if( psz_var )
589     {
590         gtk_entry_set_text( GTK_ENTRY( gtk_object_get_data(
591             GTK_OBJECT( p_intf->p_sys->p_open ), "sat_freq" ) ),
592             psz_var );
593         free( psz_var );
594     }
595
596     psz_var = config_GetPsz( p_intf, "symbol-rate" );
597     if( psz_var )
598     {
599         gtk_entry_set_text( GTK_ENTRY( gtk_object_get_data(
600             GTK_OBJECT( p_intf->p_sys->p_open ), "sat_srate" ) ),
601             psz_var );
602         free( psz_var );
603     }
604 #endif /*HAVE_SATELITE*/
605
606     /* subtitle stuff */
607     /* hide hbox_subtitle */
608     gtk_widget_hide_all( GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( p_intf->p_sys->p_open ), "hbox_subtitle" ) ) );
609     /* sout */
610     psz_var = config_GetPsz( p_intf, "sout" );
611     if( psz_var && *psz_var )
612     {
613         gtk_toggle_button_set_active(  gtk_object_get_data( GTK_OBJECT( p_intf->p_sys->p_open ), "show_sout_settings" ), TRUE );
614         gtk_widget_set_sensitive( GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( p_intf->p_sys->p_open ), "sout_settings" ) ), TRUE );
615     }
616     else
617     {
618         gtk_toggle_button_set_active(  gtk_object_get_data( GTK_OBJECT( p_intf->p_sys->p_open ), "show_sout_settings" ), FALSE );
619         gtk_widget_set_sensitive( GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( p_intf->p_sys->p_open ), "sout_settings" ) ), FALSE );
620     }
621     if( psz_var ) free( psz_var );
622
623     /* Set the right page */
624 setpage:
625     p_notebook = lookup_widget( GTK_WIDGET( p_intf->p_sys->p_open ),
626                                 "open_notebook" );
627     gtk_notebook_set_page( GTK_NOTEBOOK( p_notebook ), i_page );
628
629     gtk_widget_show( p_intf->p_sys->p_open );
630     gdk_window_raise( p_intf->p_sys->p_open->window );
631 }
632
633 void GtkOpenOk( GtkButton * button, gpointer user_data )
634 {
635     /* Check what was pressed */
636     intf_thread_t * p_intf = GtkGetIntf( button );
637     playlist_t *    p_playlist;
638     GtkCList *      p_playlist_clist;
639     gchar *         psz_target;
640
641     /* Hide the dialog box */
642     gtk_widget_hide( gtk_widget_get_toplevel( GTK_WIDGET (button) ) );
643
644     /* Update the playlist */
645     p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
646     if( p_playlist == NULL )
647     {
648         return;
649     }
650
651     psz_target = gtk_entry_get_text( GTK_ENTRY( lookup_widget(
652                                        GTK_WIDGET(button), "entry_open" ) ) );
653     playlist_Add( p_playlist, (char*)psz_target, 0, 0,
654                   PLAYLIST_APPEND | PLAYLIST_GO, PLAYLIST_END );
655
656     /* catch the GTK CList */
657     p_playlist_clist = GTK_CLIST( gtk_object_get_data(
658         GTK_OBJECT( p_intf->p_sys->p_playwin ), "playlist_clist" ) );
659     /* update the plugin display */
660     GtkRebuildCList( p_playlist_clist, p_playlist );
661
662     vlc_object_release( p_playlist );
663
664     /* export subtitle */
665     if( GTK_TOGGLE_BUTTON( lookup_widget( GTK_WIDGET(button),
666                            "show_subtitle" ) )->active )
667     {
668         /* yeah subtitle */
669         char    *psz_subtitle;
670         gfloat  delay;
671         gfloat  fps;
672
673         psz_subtitle = gtk_entry_get_text( GTK_ENTRY( lookup_widget( GTK_WIDGET(button), "entry_subtitle" ) ) );
674         delay = gtk_spin_button_get_value_as_float( GTK_SPIN_BUTTON( lookup_widget( GTK_WIDGET(button), "subtitle_delay" ) ) );
675         fps = gtk_spin_button_get_value_as_float( GTK_SPIN_BUTTON( lookup_widget( GTK_WIDGET(button), "subtitle_fps" ) ) );
676
677         config_PutPsz( p_intf, "sub-file", psz_subtitle );
678         config_PutInt( p_intf, "sub-delay", (int)( delay * 10 ) );
679         config_PutFloat( p_intf, "sub-fps", fps );
680     }
681     else
682     {
683         config_PutPsz( p_intf, "sub-file", "" );
684     }
685     /* export sout */
686     if( GTK_TOGGLE_BUTTON( lookup_widget( GTK_WIDGET(button),
687                            "show_sout_settings" ) )->active )
688     {
689         char    *psz_sout;
690
691         psz_sout = gtk_entry_get_text( GTK_ENTRY( lookup_widget( GTK_WIDGET( p_intf->p_sys->p_sout ), "sout_entry_target" ) ) );
692         config_PutPsz( p_intf, "sout", psz_sout );
693     }
694     else
695     {
696         config_PutPsz( p_intf, "sout", "" );
697     }
698 }
699
700 void GtkOpenCancel( GtkButton * button, gpointer user_data )
701 {
702     gtk_widget_hide( gtk_widget_get_toplevel( GTK_WIDGET (button) ) );
703 }
704
705 void GtkOpenChanged( GtkWidget * button, gpointer user_data )
706 {
707     intf_thread_t * p_intf = GtkGetIntf( button );
708     GtkWidget *p_notebook;
709     int i_page;
710
711     p_notebook = lookup_widget( GTK_WIDGET( p_intf->p_sys->p_open ),
712                                 "open_notebook" );
713     i_page = gtk_notebook_get_current_page( GTK_NOTEBOOK( p_notebook ) );
714
715     switch( i_page )
716     {
717         case 0:
718             GtkFileOpenChanged( button, NULL );
719             break;
720         case 1:
721             GtkDiscOpenChanged( button, NULL );
722             break;
723         case 2:
724             GtkNetworkOpenChanged( button, NULL );
725             break;
726         case 3:
727             GtkSatOpenChanged( button, NULL );
728             break;
729     }
730 }
731