]> git.sesse.net Git - vlc/blob - plugins/gtk/gtk_display.c
* Fixed the BeOS compile typo.
[vlc] / plugins / gtk / gtk_display.c
1 /*****************************************************************************
2  * gtk_display.c: Gtk+ tools for main interface
3  *****************************************************************************
4  * Copyright (C) 1999, 2000 VideoLAN
5  * $Id: gtk_display.c,v 1.3 2001/05/30 17:03:12 sam Exp $
6  *
7  * Authors: Samuel 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 "defs.h"
29
30 #include <errno.h>                                                 /* ENOMEM */
31 #include <stdlib.h>                                                /* free() */
32 #include <string.h>                                            /* strerror() */
33 #include <stdio.h>
34
35 #include <gtk/gtk.h>
36
37 #include "config.h"
38 #include "common.h"
39 #include "threads.h"
40 #include "mtime.h"
41 #include "tests.h"
42 #include "modules.h"
43
44 #include "stream_control.h"
45 #include "input_ext-intf.h"
46
47 #include "interface.h"
48 #include "intf_msg.h"
49 #include "intf_playlist.h"
50
51 #include "video.h"
52 #include "video_output.h"
53
54 #include "gtk_callbacks.h"
55 #include "gtk_interface.h"
56 #include "gtk_support.h"
57 #include "gtk_menu.h"
58 #include "gtk_display.h"
59 #include "intf_gtk.h"
60
61 #include "main.h"
62
63 #include "modules_export.h"
64
65 /*****************************************************************************
66  * GtkDisplayDate: display stream date
67  *****************************************************************************
68  * This function displays the current date related to the position in
69  * the stream. It is called whenever the slider changes its value.
70  * The lock has to be taken before you call the function.
71  *****************************************************************************/
72 void GtkDisplayDate( GtkAdjustment *p_adj )
73 {
74     intf_thread_t *p_intf;
75    
76     p_intf = gtk_object_get_data( GTK_OBJECT( p_adj ), "p_intf" );
77
78     if( p_intf->p_input != NULL )
79     {
80 #define p_area p_intf->p_input->stream.p_selected_area
81         char psz_time[ OFFSETTOTIME_MAX_SIZE ];
82
83         gtk_frame_set_label( GTK_FRAME( p_intf->p_sys->p_slider_frame ),
84                             input_OffsetToTime( p_intf->p_input, psz_time,
85                                    ( p_area->i_size * p_adj->value ) / 100 ) );
86 #undef p_area
87      }
88 }
89
90
91 /*****************************************************************************
92  * GtkModeManage: actualise the aspect of the interface whenever the input
93  *                changes.
94  *****************************************************************************
95  * The lock has to be taken before you call the function.
96  *****************************************************************************/
97 gint GtkModeManage( intf_thread_t * p_intf )
98 {
99     GtkWidget *     p_dvd_box;
100     GtkWidget *     p_file_box;
101     GtkWidget *     p_network_box;
102     GtkWidget *     p_slider;
103     GtkWidget *     p_label;
104     boolean_t       b_control;
105
106 #define GETWIDGET( ptr, name ) GTK_WIDGET( gtk_object_get_data( GTK_OBJECT( \
107                            p_intf->p_sys->ptr ) , ( name ) ) )
108     /* hide all boxes except default file box */
109     p_file_box = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT(
110                  p_intf->p_sys->p_window ), "file_box" ) );
111     gtk_widget_hide( GTK_WIDGET( p_file_box ) );
112
113     p_network_box = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT(
114                  p_intf->p_sys->p_window ), "network_box" ) );
115     gtk_widget_hide( GTK_WIDGET( p_network_box ) );
116
117     p_dvd_box = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT(
118                  p_intf->p_sys->p_window ), "dvd_box" ) );
119     gtk_widget_hide( GTK_WIDGET( p_dvd_box ) );
120
121     /* hide slider */
122     p_slider = GTK_WIDGET( gtk_object_get_data( GTK_OBJECT(
123                            p_intf->p_sys->p_window ), "slider_frame" ) );
124     gtk_widget_hide( GTK_WIDGET( p_slider ) );
125
126     /* controls unavailable */
127     b_control = 0;
128
129     /* show the box related to current input mode */
130     if( p_intf->p_input != NULL )
131     {
132         switch( p_intf->p_input->stream.i_method & 0xf0 )
133         {
134             case INPUT_METHOD_FILE:
135 //intf_WarnMsg( 2, "intf info: file method" );
136                 gtk_widget_show( GTK_WIDGET( p_file_box ) );
137                 p_label = gtk_object_get_data( GTK_OBJECT(
138                             p_intf->p_sys->p_window ),
139                             "label_status" );
140                 gtk_label_set_text( GTK_LABEL( p_label ),
141                                     p_intf->p_input->p_source );
142                 break;
143             case INPUT_METHOD_DISC:
144 //intf_WarnMsg( 2, "intf info: disc method" );
145                 gtk_widget_show( GTK_WIDGET( p_dvd_box ) );
146                 break;
147             case INPUT_METHOD_NETWORK:
148 //intf_WarnMsg( 2, "intf info: network method" );
149                 gtk_widget_show( GTK_WIDGET( p_network_box ) );
150                 p_label = gtk_object_get_data( GTK_OBJECT(
151                             p_intf->p_sys->p_window ),
152                             "network_address_label" );
153                 gtk_label_set_text( GTK_LABEL( p_label ),
154                                     p_intf->p_input->p_source );
155                 break;
156             default:
157                 intf_ErrMsg( "intf error: can't determine input method" );
158                 break;
159         }
160     
161         /* slider for seekable streams */
162         if( p_intf->p_input->stream.b_seekable )
163         {
164             gtk_widget_show( GTK_WIDGET( p_slider ) );
165         }
166     
167         /* control buttons for free pace streams */
168         b_control = p_intf->p_input->stream.b_pace_control;
169
170         /* get ready for menu regeneration */
171         p_intf->p_sys->b_title_update = 1;
172         p_intf->p_sys->b_chapter_update = 1;
173         p_intf->p_sys->b_angle_update = 1;
174         p_intf->p_sys->b_audio_update = 1;
175         p_intf->p_sys->b_spu_update = 1;
176         p_intf->p_sys->i_part = 0;
177     
178         p_intf->p_input->stream.b_changed = 0;
179         intf_WarnMsg( 3, 
180                       "intf info: menus refreshed as stream has changed" );
181     }
182     else
183     {
184 //intf_WarnMsg( 2, "intf info: default to file method" );
185         /* default mode */
186         p_label = gtk_object_get_data( GTK_OBJECT( p_intf->p_sys->p_window ),
187                         "label_status" );
188         gtk_label_set_text( GTK_LABEL( p_label ), "" );
189         gtk_widget_show( GTK_WIDGET( p_file_box ) );
190
191         /* unsensitize menus */
192         gtk_widget_set_sensitive( GETWIDGET(p_window,"menubar_title"), FALSE );
193         gtk_widget_set_sensitive( GETWIDGET(p_window,"menubar_chapter"),
194                                   FALSE );
195         gtk_widget_set_sensitive( GETWIDGET(p_window,"menubar_angle"), FALSE );
196         gtk_widget_set_sensitive( GETWIDGET(p_window,"menubar_audio"), FALSE );
197         gtk_widget_set_sensitive( GETWIDGET(p_window,"menubar_subpictures"),
198                                   FALSE );
199         gtk_widget_set_sensitive( GETWIDGET(p_popup,"popup_navigation"),
200                                   FALSE );
201         gtk_widget_set_sensitive( GETWIDGET(p_popup,"popup_angle"), FALSE );
202         gtk_widget_set_sensitive( GETWIDGET(p_popup,"popup_audio"), FALSE );
203         gtk_widget_set_sensitive( GETWIDGET(p_popup,"popup_subpictures"),
204                                   FALSE );
205     }
206
207     /* set control items */
208     gtk_widget_set_sensitive( GETWIDGET(p_window, "toolbar_back"), FALSE );
209     gtk_widget_set_sensitive( GETWIDGET(p_window, "toolbar_stop"), b_control );
210     gtk_widget_set_sensitive( GETWIDGET(p_window, "toolbar_pause"), b_control );
211     gtk_widget_set_sensitive( GETWIDGET(p_window, "toolbar_slow"), b_control );
212     gtk_widget_set_sensitive( GETWIDGET(p_window, "toolbar_fast"), b_control );
213     gtk_widget_set_sensitive( GETWIDGET(p_popup, "popup_back"), FALSE );
214     gtk_widget_set_sensitive( GETWIDGET(p_popup, "popup_stop"), b_control );
215     gtk_widget_set_sensitive( GETWIDGET(p_popup, "popup_pause"), b_control );
216     gtk_widget_set_sensitive( GETWIDGET(p_popup, "popup_slow"), b_control );
217     gtk_widget_set_sensitive( GETWIDGET(p_popup, "popup_fast"), b_control );
218
219 #undef GETWIDGET
220     return TRUE;
221 }