1 /*****************************************************************************
2 * gtk_open.c : functions to handle file/disc/network open widgets.
3 *****************************************************************************
4 * Copyright (C) 2000, 2001 VideoLAN
5 * $Id: gtk_open.c,v 1.24 2002/05/18 02:12:20 ipkiss Exp $
7 * Authors: Samuel Hocevar <sam@zoy.org>
8 * Stéphane Borel <stef@via.ecp.fr>
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.
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.
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 *****************************************************************************/
25 /*****************************************************************************
27 *****************************************************************************/
28 #include <sys/types.h> /* off_t */
31 #include <videolan/vlc.h>
33 #ifdef MODULE_NAME_IS_gnome
41 #include "stream_control.h"
42 #include "input_ext-intf.h"
44 #include "interface.h"
45 #include "intf_playlist.h"
47 #include "gtk_callbacks.h"
48 #include "gtk_interface.h"
49 #include "gtk_support.h"
50 #include "gtk_playlist.h"
51 #include "gtk_common.h"
55 /*****************************************************************************
57 *****************************************************************************
58 * The following callbacks are related to the file requester.
59 *****************************************************************************/
60 gboolean GtkFileOpenShow( GtkWidget *widget,
61 GdkEventButton *event,
64 intf_thread_t *p_intf = GetIntf( GTK_WIDGET(widget), (char*)user_data );
66 /* If we have never used the file selector, open it */
67 if( !GTK_IS_WIDGET( p_intf->p_sys->p_fileopen ) )
71 p_intf->p_sys->p_fileopen = create_intf_fileopen();
72 gtk_object_set_data( GTK_OBJECT( p_intf->p_sys->p_fileopen ),
75 if( (psz_path = config_GetPszVariable( "search-path" )) )
76 gtk_file_selection_set_filename( GTK_FILE_SELECTION(
77 p_intf->p_sys->p_fileopen ), psz_path );
78 if( psz_path ) free( psz_path );
81 gtk_widget_show( p_intf->p_sys->p_fileopen );
82 gdk_window_raise( p_intf->p_sys->p_fileopen->window );
88 void GtkFileOpenCancel( GtkButton * button, gpointer user_data )
90 gtk_widget_hide( gtk_widget_get_toplevel( GTK_WIDGET (button) ) );
93 void GtkFileOpenOk( GtkButton * button, gpointer user_data )
95 intf_thread_t * p_intf = GetIntf( GTK_WIDGET(button), "intf_fileopen" );
96 GtkCList * p_playlist_clist;
97 GtkWidget * p_filesel;
99 int i_end = p_main->p_playlist->i_size;
101 /* hide the file selector */
102 p_filesel = gtk_widget_get_toplevel( GTK_WIDGET(button) );
103 gtk_widget_hide( p_filesel );
105 /* add the new file to the interface playlist */
107 gtk_file_selection_get_filename( GTK_FILE_SELECTION( p_filesel ) );
108 intf_PlaylistAdd( p_main->p_playlist, PLAYLIST_END, (char*)psz_filename );
110 /* catch the GTK CList */
111 p_playlist_clist = GTK_CLIST( gtk_object_get_data(
112 GTK_OBJECT( p_intf->p_sys->p_playlist ), "playlist_clist" ) );
113 /* update the plugin display */
114 GtkRebuildCList( p_playlist_clist, p_main->p_playlist );
116 /* end current item, select added item */
117 if( p_input_bank->pp_input[0] != NULL )
119 p_input_bank->pp_input[0]->b_eof = 1;
122 intf_PlaylistJumpto( p_main->p_playlist, i_end - 1 );
125 /*****************************************************************************
126 * Open disc callbacks
127 *****************************************************************************
128 * The following callbacks are related to the disc manager.
129 *****************************************************************************/
130 gboolean GtkDiscOpenShow( GtkWidget *widget,
131 GdkEventButton *event,
134 intf_thread_t *p_intf = GetIntf( GTK_WIDGET(widget), (char*)user_data );
136 if( !GTK_IS_WIDGET( p_intf->p_sys->p_disc ) )
138 p_intf->p_sys->p_disc = create_intf_disc();
139 gtk_object_set_data( GTK_OBJECT( p_intf->p_sys->p_disc ),
143 gtk_widget_show( p_intf->p_sys->p_disc );
144 gdk_window_raise( p_intf->p_sys->p_disc->window );
150 void GtkDiscOpenDvd( GtkToggleButton * togglebutton, gpointer user_data )
152 if( togglebutton->active )
154 char *psz_dvd_device;
156 if( (psz_dvd_device = config_GetPszVariable( "dvd" )) )
158 GTK_ENTRY( lookup_widget( GTK_WIDGET(togglebutton),
159 "disc_name" ) ), psz_dvd_device );
160 if( psz_dvd_device ) free( psz_dvd_device );
164 void GtkDiscOpenVcd( GtkToggleButton * togglebutton, gpointer user_data )
166 if( togglebutton->active )
168 char *psz_vcd_device;
170 if( (psz_vcd_device = config_GetPszVariable( "vcd" )) )
172 GTK_ENTRY( lookup_widget( GTK_WIDGET(togglebutton),
173 "disc_name" ) ), psz_vcd_device );
174 if( psz_vcd_device ) free( psz_vcd_device );
178 void GtkDiscOpenOk( GtkButton * button, gpointer user_data )
180 intf_thread_t * p_intf = GetIntf( GTK_WIDGET(button), "intf_disc" );
181 GtkCList * p_playlist_clist;
182 char * psz_device, *psz_source, *psz_method;
183 int i_end = p_main->p_playlist->i_size;
184 int i_title, i_chapter;
186 gtk_widget_hide( p_intf->p_sys->p_disc );
187 psz_device = gtk_entry_get_text( GTK_ENTRY( lookup_widget(
188 GTK_WIDGET(button), "disc_name" ) ) );
190 /* Check which method was activated */
191 if( GTK_TOGGLE_BUTTON( lookup_widget( GTK_WIDGET(button),
192 "disc_dvd" ) )->active )
196 else if( GTK_TOGGLE_BUTTON( lookup_widget( GTK_WIDGET(button),
197 "disc_vcd" ) )->active )
203 intf_ErrMsg( "intf error: unknown disc type toggle button position" );
207 /* Select title and chapter */
208 i_title = gtk_spin_button_get_value_as_int(
209 GTK_SPIN_BUTTON( lookup_widget(
210 GTK_WIDGET(button), "disc_title" ) ) );
212 i_chapter = gtk_spin_button_get_value_as_int(
213 GTK_SPIN_BUTTON( lookup_widget(
214 GTK_WIDGET(button), "disc_chapter" ) ) );
216 /* "dvd:foo" has size 5 + strlen(foo) */
217 psz_source = malloc( 3 /* "dvd" */ + 1 /* ":" */
218 + strlen( psz_device ) + 2 /* @, */
219 + 4 /* i_title & i_chapter < 100 */ + 1 /* "\0" */ );
220 if( psz_source == NULL )
225 /* Build source name and add it to playlist */
226 sprintf( psz_source, "%s:%s@%d,%d",
227 psz_method, psz_device, i_title, i_chapter );
228 intf_PlaylistAdd( p_main->p_playlist, PLAYLIST_END, psz_source );
231 /* catch the GTK CList */
232 p_playlist_clist = GTK_CLIST( gtk_object_get_data(
233 GTK_OBJECT( p_intf->p_sys->p_playlist ), "playlist_clist" ) );
235 /* update the display */
236 GtkRebuildCList( p_playlist_clist, p_main->p_playlist );
238 /* stop current item, select added item */
239 if( p_input_bank->pp_input[0] != NULL )
241 p_input_bank->pp_input[0]->b_eof = 1;
244 intf_PlaylistJumpto( p_main->p_playlist, i_end - 1 );
248 void GtkDiscOpenCancel( GtkButton * button, gpointer user_data )
250 gtk_widget_hide( gtk_widget_get_toplevel( GTK_WIDGET (button) ) );
254 /*****************************************************************************
255 * Network stream callbacks
256 *****************************************************************************
257 * The following callbacks are related to the network stream manager.
258 *****************************************************************************/
259 gboolean GtkNetworkOpenShow( GtkWidget *widget,
260 GdkEventButton *event,
263 intf_thread_t *p_intf = GetIntf( GTK_WIDGET(widget), (char*)user_data );
265 if( !GTK_IS_WIDGET( p_intf->p_sys->p_network ) )
267 char *psz_channel_server;
269 p_intf->p_sys->p_network = create_intf_network();
270 gtk_object_set_data( GTK_OBJECT( p_intf->p_sys->p_network ),
273 gtk_spin_button_set_value( GTK_SPIN_BUTTON( gtk_object_get_data(
274 GTK_OBJECT( p_intf->p_sys->p_network ), "network_udp_port" ) ),
275 config_GetIntVariable( "server-port" ) );
277 psz_channel_server = config_GetPszVariable( "channel-server" );
278 if( psz_channel_server )
279 gtk_entry_set_text( GTK_ENTRY( gtk_object_get_data(
280 GTK_OBJECT( p_intf->p_sys->p_network ), "network_channel_address" ) ),
281 psz_channel_server );
282 if( psz_channel_server ) free( psz_channel_server );
284 gtk_spin_button_set_value( GTK_SPIN_BUTTON( gtk_object_get_data(
285 GTK_OBJECT( p_intf->p_sys->p_network ), "network_channel_port" ) ),
286 config_GetIntVariable( "channel-port" ) );
288 gtk_toggle_button_set_active( gtk_object_get_data( GTK_OBJECT(
289 p_intf->p_sys->p_network ), "network_channel" ),
290 config_GetIntVariable( "network-channel" ) );
293 gtk_widget_show( p_intf->p_sys->p_network );
294 gdk_window_raise( p_intf->p_sys->p_network->window );
300 void GtkNetworkOpenOk( GtkButton *button, gpointer user_data )
302 intf_thread_t * p_intf = GetIntf( GTK_WIDGET(button), "intf_network" );
303 GtkCList * p_playlist_clist;
304 char * psz_source, *psz_address;
307 int i_end = p_main->p_playlist->i_size;
309 gtk_widget_hide( p_intf->p_sys->p_network );
310 // psz_server = gtk_entry_get_text( GTK_ENTRY( lookup_widget(
311 // GTK_WIDGET(button), "network_server" ) ) );
313 /* select added item */
314 if( p_input_bank->pp_input[0] != NULL )
316 p_input_bank->pp_input[0]->b_eof = 1;
319 /* Manage channel server */
320 b_channel = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(
321 lookup_widget( GTK_WIDGET(button), "network_channel" ) ) );
322 config_PutIntVariable( "network-channel", b_channel );
324 /* Check which option was chosen */
326 if( GTK_TOGGLE_BUTTON( lookup_widget( GTK_WIDGET(button),
327 "network_udp" ) )->active )
329 /* No address in UDP mode */
332 /* Get the port number and make sure it will not
333 * overflow 5 characters */
334 i_port = gtk_spin_button_get_value_as_int( GTK_SPIN_BUTTON(
335 lookup_widget( GTK_WIDGET(button), "network_udp_port" ) ) );
338 intf_ErrMsg( "intf error: invalid port %i", i_port );
341 /* Allocate room for "protocol:@:port" */
342 psz_source = malloc( 5 /* "udp:@" */ + 1 /* ":" */
343 + 5 /* 0-65535 */ + 1 /* "\0" */ );
344 if( psz_source == NULL )
349 /* Build source name and add it to playlist */
350 sprintf( psz_source, "udp:@:%i", i_port );
352 intf_PlaylistAdd( p_main->p_playlist, PLAYLIST_END, psz_source );
355 /* catch the GTK CList */
356 p_playlist_clist = GTK_CLIST( gtk_object_get_data(
357 GTK_OBJECT( p_intf->p_sys->p_playlist ), "playlist_clist" ) );
358 /* update the display */
359 GtkRebuildCList( p_playlist_clist, p_main->p_playlist );
361 intf_PlaylistJumpto( p_main->p_playlist, i_end - 1 );
365 else if( GTK_TOGGLE_BUTTON( lookup_widget( GTK_WIDGET(button),
366 "network_multicast" ) )->active )
368 /* get the address */
369 psz_address = gtk_entry_get_text( GTK_ENTRY( lookup_widget(
370 GTK_WIDGET(button), "network_multicast_address" ) ) );
372 /* Get the port number and make sure it will not
373 * overflow 5 characters */
374 i_port = gtk_spin_button_get_value_as_int( GTK_SPIN_BUTTON(
375 lookup_widget( GTK_WIDGET(button), "network_multicast_port" ) ) );
378 intf_ErrMsg( "intf error: invalid port %i", i_port );
381 /* Allocate room for "protocol:@address:port" */
382 psz_source = malloc( 5 /* "udp:@" */
383 + strlen( psz_address ) + 1 /* ":" */
384 + 5 /* 0-65535 */ + 1 /* "\0" */ );
385 if( psz_source == NULL )
390 /* Build source name and add it to playlist */
391 sprintf( psz_source, "udp:@%s:%i", psz_address, i_port );
393 intf_PlaylistAdd( p_main->p_playlist, PLAYLIST_END, psz_source );
396 /* catch the GTK CList */
397 p_playlist_clist = GTK_CLIST( gtk_object_get_data(
398 GTK_OBJECT( p_intf->p_sys->p_playlist ), "playlist_clist" ) );
399 /* update the display */
400 GtkRebuildCList( p_playlist_clist, p_main->p_playlist );
402 intf_PlaylistJumpto( p_main->p_playlist, i_end - 1 );
406 else if( GTK_TOGGLE_BUTTON( lookup_widget( GTK_WIDGET(button),
407 "network_channel" ) )->active )
410 unsigned int i_channel_port;
412 if( p_main->p_channel == NULL )
414 network_ChannelCreate();
417 psz_channel = gtk_entry_get_text( GTK_ENTRY( lookup_widget(
418 GTK_WIDGET(button), "network_channel_address" ) ) );
419 i_channel_port = gtk_spin_button_get_value_as_int( GTK_SPIN_BUTTON(
420 lookup_widget( GTK_WIDGET(button), "network_channel_port" ) ) );
422 config_PutPszVariable( "channel-server", psz_channel );
423 if( i_channel_port < 65536 )
425 config_PutIntVariable( "channel-port", i_channel_port );
428 p_intf->p_sys->b_playing = 1;
432 else if( GTK_TOGGLE_BUTTON( lookup_widget( GTK_WIDGET(button),
433 "network_http" ) )->active )
436 psz_address = gtk_entry_get_text( GTK_ENTRY( lookup_widget(
437 GTK_WIDGET(button), "network_http_url" ) ) );
439 /* Allocate room for "protocol://url" */
440 psz_source = malloc( 7 /* "http://" */
441 + strlen( psz_address ) + 1 /* "\0" */ );
442 if( psz_source == NULL )
447 /* Build source name and add it to playlist */
448 sprintf( psz_source, "http://%s", psz_address );
450 intf_PlaylistAdd( p_main->p_playlist, PLAYLIST_END, psz_source );
453 /* catch the GTK CList */
454 p_playlist_clist = GTK_CLIST( gtk_object_get_data(
455 GTK_OBJECT( p_intf->p_sys->p_playlist ), "playlist_clist" ) );
456 /* update the display */
457 GtkRebuildCList( p_playlist_clist, p_main->p_playlist );
459 intf_PlaylistJumpto( p_main->p_playlist, i_end - 1 );
462 /* This shouldn't occur */
465 intf_ErrMsg( "intf error: unknown protocol toggle button position" );
469 /* add the item to the playlist if the channel server wasn't chosen */
475 void GtkNetworkOpenCancel( GtkButton * button, gpointer user_data)
477 gtk_widget_hide( gtk_widget_get_toplevel( GTK_WIDGET (button) ) );
481 void GtkNetworkOpenUDP( GtkToggleButton *togglebutton,
484 GtkWidget * p_network;
486 p_network = gtk_widget_get_toplevel( GTK_WIDGET (togglebutton) );
488 gtk_widget_set_sensitive( gtk_object_get_data( GTK_OBJECT( p_network ),
489 "network_udp_port_label" ),
490 gtk_toggle_button_get_active( togglebutton ) );
491 gtk_widget_set_sensitive( gtk_object_get_data( GTK_OBJECT( p_network ),
492 "network_udp_port" ),
493 gtk_toggle_button_get_active( togglebutton ) );
497 void GtkNetworkOpenMulticast( GtkToggleButton *togglebutton,
500 GtkWidget * p_network;
502 p_network = gtk_widget_get_toplevel( GTK_WIDGET (togglebutton) );
503 gtk_widget_set_sensitive( gtk_object_get_data( GTK_OBJECT( p_network ),
504 "network_multicast_address_label" ),
505 gtk_toggle_button_get_active( togglebutton ) );
506 gtk_widget_set_sensitive( gtk_object_get_data( GTK_OBJECT( p_network ),
507 "network_multicast_address_combo" ),
508 gtk_toggle_button_get_active( togglebutton ) );
510 gtk_widget_set_sensitive( gtk_object_get_data( GTK_OBJECT( p_network ),
511 "network_multicast_port_label" ),
512 gtk_toggle_button_get_active( togglebutton ) );
513 gtk_widget_set_sensitive( gtk_object_get_data( GTK_OBJECT( p_network ),
514 "network_multicast_port" ),
515 gtk_toggle_button_get_active( togglebutton ) );
519 void GtkNetworkOpenChannel( GtkToggleButton *togglebutton,
522 GtkWidget * p_network;
524 p_network = gtk_widget_get_toplevel( GTK_WIDGET (togglebutton) );
525 gtk_widget_set_sensitive( gtk_object_get_data( GTK_OBJECT( p_network ),
526 "network_channel_address_label" ),
527 gtk_toggle_button_get_active( togglebutton ) );
528 gtk_widget_set_sensitive( gtk_object_get_data( GTK_OBJECT( p_network ),
529 "network_channel_address_combo" ),
530 gtk_toggle_button_get_active( togglebutton ) );
532 gtk_widget_set_sensitive( gtk_object_get_data( GTK_OBJECT( p_network ),
533 "network_channel_port_label" ),
534 gtk_toggle_button_get_active( togglebutton ) );
535 gtk_widget_set_sensitive( gtk_object_get_data( GTK_OBJECT( p_network ),
536 "network_channel_port" ),
537 gtk_toggle_button_get_active( togglebutton ) );
541 void GtkNetworkOpenHTTP( GtkToggleButton *togglebutton,
544 GtkWidget * p_network;
546 p_network = gtk_widget_get_toplevel( GTK_WIDGET (togglebutton) );
547 gtk_widget_set_sensitive( gtk_object_get_data( GTK_OBJECT( p_network ),
548 "network_http_url_label" ),
549 gtk_toggle_button_get_active( togglebutton ) );
550 gtk_widget_set_sensitive( gtk_object_get_data( GTK_OBJECT( p_network ),
551 "network_http_url" ),
552 gtk_toggle_button_get_active( togglebutton ) );
556 /*****************************************************************************
557 * Open satellite callbacks
558 *****************************************************************************
559 * The following callbacks are related to the satellite card manager.
560 *****************************************************************************/
561 gboolean GtkSatOpenShow( GtkWidget *widget,
562 GdkEventButton *event,
565 intf_thread_t *p_intf = GetIntf( GTK_WIDGET(widget), (char*)user_data );
567 if( !GTK_IS_WIDGET( p_intf->p_sys->p_sat ) )
569 p_intf->p_sys->p_sat = create_intf_sat();
570 gtk_object_set_data( GTK_OBJECT( p_intf->p_sys->p_sat ),
574 gtk_widget_show( p_intf->p_sys->p_sat );
575 gdk_window_raise( p_intf->p_sys->p_sat->window );
580 void GtkSatOpenOk( GtkButton * button, gpointer user_data )
582 intf_thread_t * p_intf = GetIntf( GTK_WIDGET(button), "intf_sat" );
583 GtkCList * p_playlist_clist;
585 int i_end = p_main->p_playlist->i_size;
590 gtk_widget_hide( p_intf->p_sys->p_sat );
592 /* Check which polarization was activated */
593 if( GTK_TOGGLE_BUTTON( lookup_widget( GTK_WIDGET( button ),
594 "sat_pol_vert" ) )->active )
603 i_fec = strtol( gtk_entry_get_text( GTK_ENTRY( GTK_COMBO(
604 lookup_widget( GTK_WIDGET( button ), "sat_fec" )
605 )->entry ) ), NULL, 10 );
607 /* Select frequency and symbol rate */
608 i_freq = gtk_spin_button_get_value_as_int(
609 GTK_SPIN_BUTTON( lookup_widget(
610 GTK_WIDGET(button), "sat_freq" ) ) );
612 i_srate = gtk_spin_button_get_value_as_int(
613 GTK_SPIN_BUTTON( lookup_widget(
614 GTK_WIDGET(button), "sat_srate" ) ) );
616 psz_source = malloc( 22 );
617 if( psz_source == NULL )
622 /* Build source name and add it to playlist */
623 sprintf( psz_source, "%s:%d,%d,%d,%d",
624 "satellite", i_freq, b_pol, i_fec, i_srate );
625 intf_PlaylistAdd( p_main->p_playlist, PLAYLIST_END, psz_source );
628 /* catch the GTK CList */
629 p_playlist_clist = GTK_CLIST( gtk_object_get_data(
630 GTK_OBJECT( p_intf->p_sys->p_playlist ), "playlist_clist" ) );
632 /* update the display */
633 GtkRebuildCList( p_playlist_clist, p_main->p_playlist );
635 /* stop current item, select added item */
636 if( p_input_bank->pp_input[0] != NULL )
638 p_input_bank->pp_input[0]->b_eof = 1;
641 intf_PlaylistJumpto( p_main->p_playlist, i_end - 1 );
645 void GtkSatOpenCancel( GtkButton * button, gpointer user_data )
647 gtk_widget_hide( gtk_widget_get_toplevel( GTK_WIDGET (button) ) );
650 /****************************************************************************
651 * Callbacks for menuitem
652 ****************************************************************************/
653 void GtkFileOpenActivate( GtkMenuItem * menuitem, gpointer user_data )
655 GtkFileOpenShow( GTK_WIDGET( menuitem ), NULL, user_data );
659 void GtkDiscOpenActivate( GtkMenuItem * menuitem, gpointer user_data )
661 GtkDiscOpenShow( GTK_WIDGET( menuitem ), NULL, user_data );
665 void GtkNetworkOpenActivate( GtkMenuItem * menuitem, gpointer user_data )
667 GtkNetworkOpenShow( GTK_WIDGET( menuitem ), NULL, user_data );