]> git.sesse.net Git - vlc/blob - modules/gui/hildon/maemo_input.c
Make the maemo interface a bit more useable
[vlc] / modules / gui / hildon / maemo_input.c
1 /*****************************************************************************
2  * maemo_input.c : Input handling for the maemo plugin
3  *****************************************************************************
4  * Copyright (C) 2008 the VideoLAN team
5  * $Id$
6  *
7  * Authors: Antoine Lejeune <phytos@videolan.org>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22  *****************************************************************************/
23
24 #ifdef HAVE_CONFIG_H
25 # include "config.h"
26 #endif
27
28 #include <vlc_common.h>
29
30 #include "maemo.h"
31 #include "maemo_input.h"
32
33 static int input_event_cb( vlc_object_t *p_this, const char *psz_var,
34                            vlc_value_t oldval, vlc_value_t newval, void *param );
35
36
37 gboolean process_events( gpointer data )
38 {
39     intf_thread_t *p_intf = (intf_thread_t *)data;
40     vlc_spin_lock( &p_intf->p_sys->event_lock );
41
42     int i_event = p_intf->p_sys->i_event;
43     p_intf->p_sys->i_event = 0;
44
45     vlc_spin_unlock( &p_intf->p_sys->event_lock );
46     if( i_event )
47     {
48         if( i_event & EVENT_PLAYLIST_CURRENT )
49             item_changed_pl( p_intf );
50         if( i_event & EVENT_ACTIVITY )
51             item_changed_pl( p_intf );
52         if( i_event & EVENT_ITEM_CHANGED )
53             item_changed( p_intf );
54         if( i_event & EVENT_INTF_CHANGED )
55             update_position( p_intf );
56     }
57
58     return TRUE;
59 }
60
61 void set_input( intf_thread_t *p_intf, input_thread_t *p_input )
62 {
63     if( p_input && !( p_input->b_die || p_input->b_dead ) )
64     {
65         p_intf->p_sys->p_input = p_input;
66         vlc_object_hold( p_input );
67         var_AddCallback( p_input, "intf-event", input_event_cb, p_intf );
68
69         // "Activate" the seekbar
70         gtk_widget_set_sensitive( GTK_WIDGET( p_intf->p_sys->p_seekbar ), TRUE );
71     }
72     else
73         p_intf->p_sys->p_input = NULL;
74 }
75
76 void delete_input( intf_thread_t *p_intf )
77 {
78     if( p_intf->p_sys->p_input )
79     {
80         var_DelCallback( p_intf->p_sys->p_input, "intf-event",
81                          input_event_cb, p_intf );
82         vlc_object_release( p_intf->p_sys->p_input );
83         p_intf->p_sys->p_input = NULL;
84
85         // Reset the seekbar
86         hildon_seekbar_set_position( p_intf->p_sys->p_seekbar, 0 );
87         gtk_widget_set_sensitive( GTK_WIDGET( p_intf->p_sys->p_seekbar ), FALSE );
88     }
89 }
90
91 void item_changed_pl( intf_thread_t *p_intf )
92 {
93     if( p_intf->p_sys->p_input &&
94         ( p_intf->p_sys->p_input->b_dead || p_intf->p_sys->p_input->b_die ) )
95     {
96         delete_input( p_intf );
97         return;
98     }
99
100     if( !p_intf->p_sys->p_input )
101     {
102         set_input( p_intf, playlist_CurrentInput( p_intf->p_sys->p_playlist ) );
103     }
104     return;
105 }
106
107 int playlist_current_cb( vlc_object_t *p_this, const char *psz_var,
108                          vlc_value_t oldval, vlc_value_t newval, void *param )
109 {
110     (void)p_this; (void)psz_var; (void)oldval; (void)newval;
111     intf_thread_t *p_intf = (intf_thread_t *)param;
112     vlc_spin_lock( &p_intf->p_sys->event_lock );
113
114     p_intf->p_sys->i_event |= EVENT_PLAYLIST_CURRENT;
115
116     vlc_spin_unlock( &p_intf->p_sys->event_lock );
117     return VLC_SUCCESS;
118 }
119
120 int activity_cb( vlc_object_t *p_this, const char *psz_var,
121                  vlc_value_t oldval, vlc_value_t newval, void *param )
122 {
123     (void)p_this; (void)psz_var; (void)oldval; (void)newval;
124     intf_thread_t *p_intf = (intf_thread_t *)param;
125     vlc_spin_lock( &p_intf->p_sys->event_lock );
126
127     p_intf->p_sys->i_event |= EVENT_ACTIVITY;
128
129     vlc_spin_unlock( &p_intf->p_sys->event_lock );
130     return VLC_SUCCESS;
131 }
132
133 void item_changed( intf_thread_t *p_intf )
134 {
135     GtkButton *p_button = GTK_BUTTON( p_intf->p_sys->p_play_button );
136     vlc_value_t state;
137
138     if( !p_intf->p_sys->p_input )
139         return;
140
141     var_Get( p_intf->p_sys->p_input, "state", &state );
142
143     // We change the "play" button
144     if( state.i_int == PLAYING_S )
145         gtk_button_set_image( p_button, gtk_image_new_from_stock( "vlc-pause",
146                               GTK_ICON_SIZE_BUTTON ) );
147     else
148         gtk_button_set_image( p_button, gtk_image_new_from_stock( "vlc-play",
149                               GTK_ICON_SIZE_BUTTON ) );
150 }
151
152 int item_changed_cb( vlc_object_t *p_this, const char *psz_var,
153                      vlc_value_t oldval, vlc_value_t newval, void *param )
154 {
155     (void)p_this; (void)psz_var; (void)oldval; (void)newval;
156     intf_thread_t *p_intf = (intf_thread_t *)param;
157     vlc_spin_lock( &p_intf->p_sys->event_lock );
158
159     p_intf->p_sys->i_event |= EVENT_ITEM_CHANGED;
160
161     vlc_spin_unlock( &p_intf->p_sys->event_lock );
162     return VLC_SUCCESS;
163 }
164
165 void update_position( intf_thread_t *p_intf )
166 {
167     if( p_intf->p_sys->p_input )
168     {
169         hildon_seekbar_set_total_time( p_intf->p_sys->p_seekbar,
170                     var_GetTime( p_intf->p_sys->p_input, "length" )/1000000 );
171         hildon_seekbar_set_position( p_intf->p_sys->p_seekbar,
172                     var_GetTime( p_intf->p_sys->p_input, "time" )/1000000 );
173     }
174 }
175
176 int interface_changed_cb( vlc_object_t *p_this, const char *psz_var,
177                           vlc_value_t oldval, vlc_value_t newval, void *param )
178 {
179     (void)p_this; (void)psz_var; (void)oldval; (void)newval;
180     intf_thread_t *p_intf = (intf_thread_t *)param;
181     vlc_spin_lock( &p_intf->p_sys->event_lock );
182
183     p_intf->p_sys->i_event |= EVENT_INTF_CHANGED;
184
185     vlc_spin_unlock( &p_intf->p_sys->event_lock );
186     return VLC_SUCCESS;
187 }
188
189 static int input_event_cb( vlc_object_t *p_this, const char *psz_var,
190                            vlc_value_t oldval, vlc_value_t newval, void *param )
191 {
192     if( newval.i_int == INPUT_EVENT_STATE )
193         return item_changed_cb( p_this, psz_var, oldval, newval, param );
194     else
195         return interface_changed_cb( p_this, psz_var, oldval, newval, param );
196 }