1 /*****************************************************************************
2 * gtk_callbacks.c : Callbacks for the Gtk+ plugin.
3 *****************************************************************************
4 * Copyright (C) 2000, 2001 VideoLAN
5 * $Id: gtk_callbacks.c,v 1.25 2001/11/12 04:12:37 sam 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 *****************************************************************************/
29 #include <sys/types.h> /* off_t */
41 #include "stream_control.h"
42 #include "input_ext-intf.h"
44 #include "interface.h"
45 #include "intf_playlist.h"
49 #include "video_output.h"
51 #include "gtk_callbacks.h"
52 #include "gtk_interface.h"
53 #include "gtk_support.h"
59 #include "modules_export.h"
61 /*****************************************************************************
63 *****************************************************************************/
66 * Main interface callbacks
69 gboolean GtkExit( GtkWidget *widget,
70 GdkEventButton *event,
73 intf_thread_t *p_intf = GetIntf( GTK_WIDGET(widget), (char*)user_data );
75 vlc_mutex_lock( &p_intf->change_lock );
77 vlc_mutex_unlock( &p_intf->change_lock );
82 gboolean GtkWindowDelete( GtkWidget *widget,
86 GtkExit( GTK_WIDGET( widget ), NULL, user_data );
92 gboolean GtkWindowToggle( GtkWidget *widget,
93 GdkEventButton *event,
96 intf_thread_t *p_intf = GetIntf( GTK_WIDGET(widget), (char*)user_data );
98 if( GTK_WIDGET_VISIBLE(p_intf->p_sys->p_window) )
100 gtk_widget_hide( p_intf->p_sys->p_window);
105 gtk_widget_show( p_intf->p_sys->p_window );
111 gboolean GtkFullscreen( GtkWidget *widget,
112 GdkEventButton *event,
115 if( p_vout_bank->i_count )
117 vlc_mutex_lock( &p_vout_bank->pp_vout[0]->change_lock );
119 p_vout_bank->pp_vout[0]->i_changes |= VOUT_FULLSCREEN_CHANGE;
121 vlc_mutex_unlock( &p_vout_bank->pp_vout[0]->change_lock );
131 void GtkWindowDrag( GtkWidget *widget,
132 GdkDragContext *drag_context,
135 GtkSelectionData *data,
140 intf_thread_t * p_intf = GetIntf( GTK_WIDGET(widget), "intf_window" );
141 int end = p_main->p_playlist->i_size;
142 GtkDropDataReceived( p_intf, data, info, PLAYLIST_END );
144 if( p_intf->p_input != NULL )
146 /* FIXME: temporary hack */
147 p_intf->p_input->b_eof = 1;
150 intf_PlaylistJumpto( p_main->p_playlist, end-1 );
154 /****************************************************************************
156 ****************************************************************************/
158 gboolean GtkSliderRelease( GtkWidget *widget,
159 GdkEventButton *event,
162 intf_thread_t *p_intf = GetIntf( GTK_WIDGET(widget), "intf_window" );
164 vlc_mutex_lock( &p_intf->change_lock );
165 p_intf->p_sys->b_slider_free = 1;
166 vlc_mutex_unlock( &p_intf->change_lock );
172 gboolean GtkSliderPress( GtkWidget *widget,
173 GdkEventButton *event,
176 intf_thread_t *p_intf = GetIntf( GTK_WIDGET(widget), "intf_window" );
178 vlc_mutex_lock( &p_intf->change_lock );
179 p_intf->p_sys->b_slider_free = 0;
180 vlc_mutex_unlock( &p_intf->change_lock );
186 /****************************************************************************
188 ****************************************************************************/
190 void GtkTitlePrev( GtkButton * button, gpointer user_data )
192 intf_thread_t * p_intf;
193 input_area_t * p_area;
196 p_intf = GetIntf( GTK_WIDGET(button), (char*)user_data );
197 i_id = p_intf->p_input->stream.p_selected_area->i_id - 1;
199 /* Disallow area 0 since it is used for video_ts.vob */
202 p_area = p_intf->p_input->stream.pp_areas[i_id];
203 input_ChangeArea( p_intf->p_input, (input_area_t*)p_area );
205 input_SetStatus( p_intf->p_input, INPUT_STATUS_PLAY );
207 p_intf->p_sys->b_title_update = 1;
208 vlc_mutex_lock( &p_intf->p_input->stream.stream_lock );
209 GtkSetupMenus( p_intf );
210 vlc_mutex_unlock( &p_intf->p_input->stream.stream_lock );
215 void GtkTitleNext( GtkButton * button, gpointer user_data )
217 intf_thread_t * p_intf;
218 input_area_t * p_area;
221 p_intf = GetIntf( GTK_WIDGET(button), (char*)user_data );
222 i_id = p_intf->p_input->stream.p_selected_area->i_id + 1;
224 if( i_id < p_intf->p_input->stream.i_area_nb )
226 p_area = p_intf->p_input->stream.pp_areas[i_id];
227 input_ChangeArea( p_intf->p_input, (input_area_t*)p_area );
229 input_SetStatus( p_intf->p_input, INPUT_STATUS_PLAY );
231 p_intf->p_sys->b_title_update = 1;
232 vlc_mutex_lock( &p_intf->p_input->stream.stream_lock );
233 GtkSetupMenus( p_intf );
234 vlc_mutex_unlock( &p_intf->p_input->stream.stream_lock );
240 void GtkChapterPrev( GtkButton * button, gpointer user_data )
242 intf_thread_t * p_intf;
243 input_area_t * p_area;
245 p_intf = GetIntf( GTK_WIDGET(button), (char*)user_data );
246 p_area = p_intf->p_input->stream.p_selected_area;
248 if( p_area->i_part > 0 )
251 input_ChangeArea( p_intf->p_input, (input_area_t*)p_area );
253 input_SetStatus( p_intf->p_input, INPUT_STATUS_PLAY );
255 p_intf->p_sys->b_chapter_update = 1;
256 vlc_mutex_lock( &p_intf->p_input->stream.stream_lock );
257 GtkSetupMenus( p_intf );
258 vlc_mutex_unlock( &p_intf->p_input->stream.stream_lock );
263 void GtkChapterNext( GtkButton * button, gpointer user_data )
265 intf_thread_t * p_intf;
266 input_area_t * p_area;
268 p_intf = GetIntf( GTK_WIDGET(button), (char*)user_data );
269 p_area = p_intf->p_input->stream.p_selected_area;
271 if( p_area->i_part < p_area->i_part_nb )
274 input_ChangeArea( p_intf->p_input, (input_area_t*)p_area );
276 input_SetStatus( p_intf->p_input, INPUT_STATUS_PLAY );
278 p_intf->p_sys->b_chapter_update = 1;
279 vlc_mutex_lock( &p_intf->p_input->stream.stream_lock );
280 GtkSetupMenus( p_intf );
281 vlc_mutex_unlock( &p_intf->p_input->stream.stream_lock );
285 /****************************************************************************
286 * Network specific items
287 ****************************************************************************/
288 void GtkNetworkJoin( GtkEditable * editable, gpointer user_data )
292 i_channel = gtk_spin_button_get_value_as_int( GTK_SPIN_BUTTON( editable ) );
293 // intf_WarnMsg( 3, "intf info: joining channel %d", i_channel );
295 // network_ChannelJoin( i_channel );
298 void GtkChannelGo( GtkButton * button, gpointer user_data )
304 intf_thread_t *p_intf = GetIntf( GTK_WIDGET(button), (char*)user_data );
306 window = gtk_widget_get_toplevel( GTK_WIDGET (button) );
307 spin = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( window ),
308 "network_channel_spinbutton" ) );
310 i_channel = gtk_spin_button_get_value_as_int( GTK_SPIN_BUTTON( spin ) );
311 intf_WarnMsg( 3, "intf info: joining channel %d", i_channel );
313 vlc_mutex_lock( &p_intf->change_lock );
314 if( p_intf->p_input != NULL )
316 /* end playing item */
317 p_intf->p_input->b_eof = 1;
319 /* update playlist */
320 vlc_mutex_lock( &p_main->p_playlist->change_lock );
322 p_main->p_playlist->i_index--;
323 p_main->p_playlist->b_stopped = 1;
325 vlc_mutex_unlock( &p_main->p_playlist->change_lock );
327 /* FIXME: ugly hack to close input and outputs */
328 p_intf->pf_manage( p_intf );
331 network_ChannelJoin( i_channel );
334 p_main->p_playlist->b_stopped = 0;
335 p_intf->pf_manage( p_intf );
337 vlc_mutex_unlock( &p_intf->change_lock );
339 input_SetStatus( p_intf->p_input, INPUT_STATUS_PLAY );
343 /****************************************************************************
345 ****************************************************************************/
347 gboolean GtkAboutShow( GtkWidget *widget,
348 GdkEventButton *event,
351 intf_thread_t *p_intf = GetIntf( GTK_WIDGET(widget), (char*)user_data );
353 if( !GTK_IS_WIDGET( p_intf->p_sys->p_about ) )
355 p_intf->p_sys->p_about = create_intf_about();
356 gtk_object_set_data( GTK_OBJECT( p_intf->p_sys->p_about ),
359 gtk_widget_show( p_intf->p_sys->p_about );
360 gdk_window_raise( p_intf->p_sys->p_about->window );
365 void GtkAboutOk( GtkButton * button, gpointer user_data)
367 intf_thread_t *p_intf = GetIntf( GTK_WIDGET(button), (char*)user_data );
369 gtk_widget_hide( p_intf->p_sys->p_about );
373 /****************************************************************************
375 ****************************************************************************/
377 gboolean GtkJumpShow( GtkWidget *widget,
378 GdkEventButton *event,
381 intf_thread_t *p_intf = GetIntf( GTK_WIDGET(widget), (char*)user_data );
383 if( !GTK_IS_WIDGET( p_intf->p_sys->p_jump ) )
385 p_intf->p_sys->p_jump = create_intf_jump();
386 gtk_object_set_data( GTK_OBJECT( p_intf->p_sys->p_jump ),
390 gtk_widget_show( p_intf->p_sys->p_jump );
391 gdk_window_raise( p_intf->p_sys->p_jump->window );
397 void GtkJumpOk( GtkButton *button,
400 intf_thread_t * p_intf;
407 p_intf = GetIntf( GTK_WIDGET( button ), (char*)user_data );
409 #define GET_VALUE( name ) \
410 gtk_spin_button_get_value_as_int( GTK_SPIN_BUTTON( gtk_object_get_data( \
411 GTK_OBJECT( p_intf->p_sys->p_jump ), name ) ) )
413 i_hours = GET_VALUE( "jump_hour_spinbutton" );
414 i_minutes = GET_VALUE( "jump_minute_spinbutton" );
415 i_seconds = GET_VALUE( "jump_second_spinbutton" );
419 i_seconds += 60 *i_minutes + 3600* i_hours;
421 vlc_mutex_lock( &p_intf->p_input->stream.stream_lock );
422 i_seek = i_seconds * 50 * p_intf->p_input->stream.i_mux_rate;
423 i_size = p_intf->p_input->stream.p_selected_area->i_size;
424 vlc_mutex_unlock( &p_intf->p_input->stream.stream_lock );
426 if( i_seek < i_size )
428 input_Seek( p_intf->p_input, i_seek );
430 p_main->p_playlist->b_stopped = 0;
431 gtk_widget_hide( gtk_widget_get_toplevel( GTK_WIDGET (button) ) );
435 void GtkJumpCancel( GtkButton *button,
438 gtk_widget_hide( gtk_widget_get_toplevel( GTK_WIDGET (button) ) );
442 /****************************************************************************
443 * Callbacks for menuitems
444 ****************************************************************************/
445 void GtkExitActivate( GtkMenuItem * menuitem, gpointer user_data )
447 GtkExit( GTK_WIDGET( menuitem ), NULL, user_data );
451 void GtkFullscreenActivate( GtkMenuItem * menuitem, gpointer user_data )
453 GtkFullscreen( GTK_WIDGET( menuitem ), NULL, user_data );
457 void GtkWindowToggleActivate( GtkMenuItem * menuitem, gpointer user_data )
459 GtkWindowToggle( GTK_WIDGET( menuitem ), NULL, user_data );
463 void GtkAboutActivate( GtkMenuItem * menuitem, gpointer user_data )
465 GtkAboutShow( GTK_WIDGET( menuitem ), NULL, user_data );
469 void GtkJumpActivate( GtkMenuItem * menuitem, gpointer user_data )
471 GtkJumpShow( GTK_WIDGET( menuitem ), NULL, user_data );