X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=plugins%2Fgtk%2Fgtk_callbacks.c;h=21a4b4b0924ca811b415aba39daeed55cc49f79c;hb=75824aafc4f8fec873f148769a1fac53c6761a1f;hp=e28a264a9dd4798948c693f82a75f8d2c78b8c72;hpb=ab1d6024998a356585477acb5fd367365ac52f9d;p=vlc diff --git a/plugins/gtk/gtk_callbacks.c b/plugins/gtk/gtk_callbacks.c index e28a264a9d..21a4b4b092 100644 --- a/plugins/gtk/gtk_callbacks.c +++ b/plugins/gtk/gtk_callbacks.c @@ -2,10 +2,11 @@ * gtk_callbacks.c : Callbacks for the Gtk+ plugin. ***************************************************************************** * Copyright (C) 2000, 2001 VideoLAN - * $Id: gtk_callbacks.c,v 1.19 2001/05/19 00:39:30 stef Exp $ + * $Id: gtk_callbacks.c,v 1.34 2002/03/25 02:06:24 jobi Exp $ * * Authors: Samuel Hocevar * Stéphane Borel + * Julien BLACHE * * 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 @@ -22,31 +23,26 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. *****************************************************************************/ -#define MODULE_NAME gtk -#include "modules_inner.h" - /***************************************************************************** * Preamble *****************************************************************************/ -#include "defs.h" #include /* off_t */ #include +#include + +#include + #include #include -#include "config.h" -#include "common.h" -#include "threads.h" -#include "mtime.h" - #include "stream_control.h" #include "input_ext-intf.h" #include "interface.h" #include "intf_playlist.h" -#include "intf_msg.h" +#include "intf_eject.h" #include "video.h" #include "video_output.h" @@ -54,9 +50,9 @@ #include "gtk_callbacks.h" #include "gtk_interface.h" #include "gtk_support.h" -#include "intf_gtk.h" +#include "gtk_common.h" -#include "main.h" +#include "netutils.h" /***************************************************************************** * Callbacks @@ -141,10 +137,10 @@ void GtkWindowDrag( GtkWidget *widget, int end = p_main->p_playlist->i_size; GtkDropDataReceived( p_intf, data, info, PLAYLIST_END ); - if( p_intf->p_input != NULL ) + if( p_input_bank->pp_input[0] != NULL ) { /* FIXME: temporary hack */ - p_intf->p_input->b_eof = 1; + p_input_bank->pp_input[0]->b_eof = 1; } intf_PlaylistJumpto( p_main->p_playlist, end-1 ); @@ -194,18 +190,20 @@ void GtkTitlePrev( GtkButton * button, gpointer user_data ) int i_id; p_intf = GetIntf( GTK_WIDGET(button), (char*)user_data ); - i_id = p_intf->p_input->stream.p_selected_area->i_id - 1; + i_id = p_input_bank->pp_input[0]->stream.p_selected_area->i_id - 1; /* Disallow area 0 since it is used for video_ts.vob */ if( i_id > 0 ) { - p_area = p_intf->p_input->stream.pp_areas[i_id]; - input_ChangeArea( p_intf->p_input, (input_area_t*)p_area ); + p_area = p_input_bank->pp_input[0]->stream.pp_areas[i_id]; + input_ChangeArea( p_input_bank->pp_input[0], (input_area_t*)p_area ); - input_SetStatus( p_intf->p_input, INPUT_STATUS_PLAY ); + input_SetStatus( p_input_bank->pp_input[0], INPUT_STATUS_PLAY ); p_intf->p_sys->b_title_update = 1; + vlc_mutex_lock( &p_input_bank->pp_input[0]->stream.stream_lock ); GtkSetupMenus( p_intf ); + vlc_mutex_unlock( &p_input_bank->pp_input[0]->stream.stream_lock ); } } @@ -217,17 +215,19 @@ void GtkTitleNext( GtkButton * button, gpointer user_data ) int i_id; p_intf = GetIntf( GTK_WIDGET(button), (char*)user_data ); - i_id = p_intf->p_input->stream.p_selected_area->i_id + 1; + i_id = p_input_bank->pp_input[0]->stream.p_selected_area->i_id + 1; - if( i_id < p_intf->p_input->stream.i_area_nb ) + if( i_id < p_input_bank->pp_input[0]->stream.i_area_nb ) { - p_area = p_intf->p_input->stream.pp_areas[i_id]; - input_ChangeArea( p_intf->p_input, (input_area_t*)p_area ); + p_area = p_input_bank->pp_input[0]->stream.pp_areas[i_id]; + input_ChangeArea( p_input_bank->pp_input[0], (input_area_t*)p_area ); - input_SetStatus( p_intf->p_input, INPUT_STATUS_PLAY ); + input_SetStatus( p_input_bank->pp_input[0], INPUT_STATUS_PLAY ); p_intf->p_sys->b_title_update = 1; + vlc_mutex_lock( &p_input_bank->pp_input[0]->stream.stream_lock ); GtkSetupMenus( p_intf ); + vlc_mutex_unlock( &p_input_bank->pp_input[0]->stream.stream_lock ); } } @@ -239,17 +239,19 @@ void GtkChapterPrev( GtkButton * button, gpointer user_data ) input_area_t * p_area; p_intf = GetIntf( GTK_WIDGET(button), (char*)user_data ); - p_area = p_intf->p_input->stream.p_selected_area; + p_area = p_input_bank->pp_input[0]->stream.p_selected_area; if( p_area->i_part > 0 ) { p_area->i_part--; - input_ChangeArea( p_intf->p_input, (input_area_t*)p_area ); + input_ChangeArea( p_input_bank->pp_input[0], (input_area_t*)p_area ); - input_SetStatus( p_intf->p_input, INPUT_STATUS_PLAY ); + input_SetStatus( p_input_bank->pp_input[0], INPUT_STATUS_PLAY ); p_intf->p_sys->b_chapter_update = 1; + vlc_mutex_lock( &p_input_bank->pp_input[0]->stream.stream_lock ); GtkSetupMenus( p_intf ); + vlc_mutex_unlock( &p_input_bank->pp_input[0]->stream.stream_lock ); } } @@ -260,20 +262,80 @@ void GtkChapterNext( GtkButton * button, gpointer user_data ) input_area_t * p_area; p_intf = GetIntf( GTK_WIDGET(button), (char*)user_data ); - p_area = p_intf->p_input->stream.p_selected_area; + p_area = p_input_bank->pp_input[0]->stream.p_selected_area; if( p_area->i_part < p_area->i_part_nb ) { p_area->i_part++; - input_ChangeArea( p_intf->p_input, (input_area_t*)p_area ); + input_ChangeArea( p_input_bank->pp_input[0], (input_area_t*)p_area ); - input_SetStatus( p_intf->p_input, INPUT_STATUS_PLAY ); + input_SetStatus( p_input_bank->pp_input[0], INPUT_STATUS_PLAY ); p_intf->p_sys->b_chapter_update = 1; + vlc_mutex_lock( &p_input_bank->pp_input[0]->stream.stream_lock ); GtkSetupMenus( p_intf ); + vlc_mutex_unlock( &p_input_bank->pp_input[0]->stream.stream_lock ); + } +} + +/**************************************************************************** + * Network specific items + ****************************************************************************/ +void GtkNetworkJoin( GtkEditable * editable, gpointer user_data ) +{ + int i_channel; + + i_channel = gtk_spin_button_get_value_as_int( GTK_SPIN_BUTTON( editable ) ); +// intf_WarnMsg( 3, "intf info: joining channel %d", i_channel ); + +// network_ChannelJoin( i_channel ); +} + +void GtkChannelGo( GtkButton * button, gpointer user_data ) +{ + GtkWidget * window; + GtkWidget * spin; + int i_channel; + + intf_thread_t *p_intf = GetIntf( GTK_WIDGET(button), (char*)user_data ); + + window = gtk_widget_get_toplevel( GTK_WIDGET (button) ); + spin = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( window ), + "network_channel_spinbutton" ) ); + + i_channel = gtk_spin_button_get_value_as_int( GTK_SPIN_BUTTON( spin ) ); + intf_WarnMsg( 3, "intf info: joining channel %d", i_channel ); + + vlc_mutex_lock( &p_intf->change_lock ); + if( p_input_bank->pp_input[0] != NULL ) + { + /* end playing item */ + p_input_bank->pp_input[0]->b_eof = 1; + + /* update playlist */ + vlc_mutex_lock( &p_main->p_playlist->change_lock ); + + p_main->p_playlist->i_index--; + p_main->p_playlist->b_stopped = 1; + + vlc_mutex_unlock( &p_main->p_playlist->change_lock ); + + /* FIXME: ugly hack to close input and outputs */ + p_intf->pf_manage( p_intf ); } + + network_ChannelJoin( i_channel ); + + /* FIXME 2 */ + p_main->p_playlist->b_stopped = 0; + p_intf->pf_manage( p_intf ); + + vlc_mutex_unlock( &p_intf->change_lock ); + +// input_SetStatus( p_input_bank->pp_input[0], INPUT_STATUS_PLAY ); } + /**************************************************************************** * About box ****************************************************************************/ @@ -352,14 +414,14 @@ void GtkJumpOk( GtkButton *button, i_seconds += 60 *i_minutes + 3600* i_hours; - vlc_mutex_lock( &p_intf->p_input->stream.stream_lock ); - i_seek = i_seconds * 50 * p_intf->p_input->stream.i_mux_rate; - i_size = p_intf->p_input->stream.p_selected_area->i_size; - vlc_mutex_unlock( &p_intf->p_input->stream.stream_lock ); + vlc_mutex_lock( &p_input_bank->pp_input[0]->stream.stream_lock ); + i_seek = i_seconds * 50 * p_input_bank->pp_input[0]->stream.i_mux_rate; + i_size = p_input_bank->pp_input[0]->stream.p_selected_area->i_size; + vlc_mutex_unlock( &p_input_bank->pp_input[0]->stream.stream_lock ); if( i_seek < i_size ) { - input_Seek( p_intf->p_input, i_seek ); + input_Seek( p_input_bank->pp_input[0], i_seek ); } p_main->p_playlist->b_stopped = 0; gtk_widget_hide( gtk_widget_get_toplevel( GTK_WIDGET (button) ) ); @@ -404,3 +466,108 @@ void GtkJumpActivate( GtkMenuItem * menuitem, gpointer user_data ) { GtkJumpShow( GTK_WIDGET( menuitem ), NULL, user_data ); } + + +void GtkMessagesActivate( GtkMenuItem * menuitem, gpointer user_data ) +{ + GtkMessagesShow( GTK_WIDGET( menuitem ), NULL, user_data ); +} + + +/**************************************************************************** + * Callbacks for disc ejection + ****************************************************************************/ +gboolean GtkDiscEject ( GtkWidget *widget, GdkEventButton *event, + gpointer user_data ) +{ + char *psz_device = NULL; + + /* + * Get the active input + * Determine whether we can eject a media, ie it's a VCD or DVD + * If it's neither a VCD nor a DVD, then return + */ + + /* + * Don't really know if I must lock the stuff here, we're using it read-only + */ + + if (p_main->p_playlist->current.psz_name != NULL) + { + if (strncmp(p_main->p_playlist->current.psz_name, "dvd", 3) + || strncmp(p_main->p_playlist->current.psz_name, "vcd", 3)) + { + /* Determine the device name by omitting the first 4 characters */ + psz_device = strdup((p_main->p_playlist->current.psz_name + 4)); + } + } + + if( psz_device == NULL ) + { + return TRUE; + } + + /* If there's a stream playing, we aren't allowed to eject ! */ + if( p_input_bank->pp_input[0] == NULL ) + { + intf_WarnMsg( 4, "intf: ejecting %s", psz_device ); + + intf_Eject( psz_device ); + } + + free(psz_device); + return TRUE; +} + +void GtkEjectDiscActivate ( GtkMenuItem *menuitem, gpointer user_data ) +{ + GtkDiscEject( GTK_WIDGET( menuitem ), NULL, user_data ); +} + +/**************************************************************************** + * Messages window + ****************************************************************************/ + +gboolean GtkMessagesShow( GtkWidget *widget, + GdkEventButton *event, + gpointer user_data) +{ + static GdkColor black = { 0, 0x0000, 0x0000, 0x0000 }; + static GdkColormap *colormap; + intf_thread_t *p_intf = GetIntf( GTK_WIDGET(widget), (char*)user_data ); + + gtk_widget_show( p_intf->p_sys->p_messages ); + colormap = gdk_colormap_get_system (); + gdk_color_alloc( colormap, &black ); + gdk_window_set_background( p_intf->p_sys->p_messages_text->text_area, + &black ); + + gdk_window_raise( p_intf->p_sys->p_messages->window ); + + gtk_text_set_point( p_intf->p_sys->p_messages_text, + gtk_text_get_length( p_intf->p_sys->p_messages_text ) ); + + return TRUE; +} + + +void +GtkMessagesOk (GtkButton *button, + gpointer user_data) +{ + intf_thread_t *p_intf = GetIntf( GTK_WIDGET(button), (char*)user_data ); + gtk_widget_hide( p_intf->p_sys->p_messages ); +} + + +gboolean +GtkMessagesDelete (GtkWidget *widget, + GdkEvent *event, + gpointer user_data) +{ + intf_thread_t *p_intf = GetIntf( GTK_WIDGET(widget), (char*)user_data ); + gtk_widget_hide( p_intf->p_sys->p_messages ); + return TRUE; +} + +