1 /*****************************************************************************
2 * pda_callbacks.c : Callbacks for the pda Linux Gtk+ plugin.
3 *****************************************************************************
4 * Copyright (C) 2000, 2001 VideoLAN
5 * $Id: pda_callbacks.c,v 1.1 2003/10/01 20:58:45 jpsaman Exp $
7 * Authors: Jean-Paul Saman <jpsaman@wxs.nl>
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.
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.
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., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
22 *****************************************************************************/
24 /*****************************************************************************
26 *****************************************************************************/
27 #include <sys/types.h> /* off_t */
45 #include "pda_callbacks.h"
46 #include "pda_interface.h"
47 #include "pda_support.h"
50 static char* get_file_perm(const char *path);
52 /*****************************************************************************
53 * Useful function to retrieve p_intf
54 ****************************************************************************/
55 void * E_(__GtkGetIntf)( GtkWidget * widget )
59 if( GTK_IS_MENU_ITEM( widget ) )
61 /* Look for a GTK_MENU */
62 while( widget->parent && !GTK_IS_MENU( widget ) )
64 widget = widget->parent;
67 /* Maybe this one has the data */
68 p_data = gtk_object_get_data( GTK_OBJECT( widget ), "p_intf" );
74 /* Otherwise, the parent widget has it */
75 widget = gtk_menu_get_attach_widget( GTK_MENU( widget ) );
78 /* We look for the top widget */
79 widget = gtk_widget_get_toplevel( GTK_WIDGET( widget ) );
81 p_data = gtk_object_get_data( GTK_OBJECT( widget ), "p_intf" );
86 void PlaylistRebuildListStore( GtkListStore * p_list, playlist_t * p_playlist )
96 vlc_mutex_lock( &p_playlist->object_lock );
97 for( i_dummy = p_playlist->i_size ; i_dummy-- ; )
99 ppsz_text[0] = p_playlist->pp_items[i_dummy]->psz_name;
100 ppsz_text[1] = "no info";
101 gtk_list_store_append (p_list, &iter);
102 gtk_list_store_set (p_list, &iter,
108 vlc_mutex_unlock( &p_playlist->object_lock );
111 /*****************************************************************************
112 * Helper functions for URL changes in Media and Preferences notebook pages.
113 ****************************************************************************/
114 void MediaURLOpenChanged( GtkWidget *widget, gchar *psz_url )
116 intf_thread_t *p_intf = GtkGetIntf( widget );
117 playlist_t *p_playlist;
118 GtkListStore *p_liststore;
120 // Add p_url to playlist .... but how ?
121 p_playlist = (playlist_t *)
122 vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
124 if( p_playlist == NULL)
131 if (p_intf->p_sys->b_autoplayfile)
133 playlist_Add( p_playlist, (char*)psz_url, 0, 0,
134 PLAYLIST_APPEND | PLAYLIST_GO, PLAYLIST_END);
138 playlist_Add( p_playlist, (char*)psz_url, 0, 0,
139 PLAYLIST_APPEND, PLAYLIST_END );
141 vlc_object_release( p_playlist );
142 msg_Dbg(p_intf, "MediaURLOpenChange: Populating GtkTreeView Playlist" );
143 p_liststore = gtk_list_store_new (2,
146 PlaylistRebuildListStore(p_liststore, p_playlist);
147 msg_Dbg(p_intf, "MediaURLOpenChange: Updating GtkTreeView Playlist" );
148 gtk_tree_view_set_model(p_intf->p_sys->p_tvplaylist, (GtkTreeModel*) p_liststore);
152 /*****************************************************************
153 * Read directory helper function.
154 ****************************************************************/
155 void ReadDirectory( intf_thread_t *p_intf, GtkListStore *p_list, char *psz_dir )
157 // intf_thread_t *p_intf = GtkGetIntf( GTK_WIDGET(p_list) );
159 struct dirent **namelist;
162 msg_Dbg(p_intf, "changing to dir %s", psz_dir);
165 status = chdir(psz_dir);
167 msg_Err( p_intf, "permision denied" );
169 n = scandir(".", &namelist, 0, alphasort);
178 msg_Dbg( p_intf, "updating interface" );
180 /* XXX : kludge temporaire pour yopy */
182 ppsz_text[1] = get_file_perm("..");
187 /* Add a new row to the model */
188 gtk_list_store_append (p_list, &iter);
189 gtk_list_store_set (p_list, &iter,
200 if (namelist[i]->d_name[0] != '.')
202 /* This is a list of strings. */
203 ppsz_text[0] = namelist[i]->d_name;
204 ppsz_text[1] = get_file_perm(namelist[i]->d_name);
209 msg_Dbg(p_intf, "(%d) file: %s permission: %s", i, ppsz_text[0], ppsz_text[1] );
210 gtk_list_store_append (p_list, &iter);
211 gtk_list_store_set (p_list, &iter,
223 /* now switch to the "file" tab */
224 if (p_intf->p_sys->p_mediabook)
226 gtk_widget_show( GTK_WIDGET(p_intf->p_sys->p_mediabook) );
227 gtk_notebook_set_page(p_intf->p_sys->p_mediabook,0);
231 static char* get_file_perm(const char *path)
236 perm = (char *) malloc(sizeof(char)*10);
237 strncpy( perm, "----------", sizeof("----------"));
238 if (lstat(path, &st)==0)
240 if (S_ISLNK(st.st_mode))
242 else if (S_ISDIR(st.st_mode))
244 else if (S_ISCHR(st.st_mode))
246 else if (S_ISBLK(st.st_mode))
248 else if (S_ISFIFO(st.st_mode))
250 else if (S_ISSOCK(st.st_mode))
252 else if (S_ISREG(st.st_mode))
254 else /* Unknown type is an error */
256 /* Get file permissions */
258 if (st.st_mode & S_IRUSR)
260 if (st.st_mode & S_IWUSR)
262 if (st.st_mode & S_IXUSR)
264 if (st.st_mode & S_ISUID)
269 else if (st.st_mode & S_ISUID)
272 if (st.st_mode & S_IRGRP)
274 if (st.st_mode & S_IWGRP)
276 if (st.st_mode & S_IXGRP)
278 if (st.st_mode & S_ISGID)
283 else if (st.st_mode & S_ISGID)
286 if (st.st_mode & S_IROTH)
288 if (st.st_mode & S_IWOTH)
290 if (st.st_mode & S_IXOTH)
293 if (st.st_mode &S_ISVTX)
298 else if (st.st_mode &S_ISVTX)
305 * Main interface callbacks
309 onPDADeleteEvent (GtkWidget *widget,
313 intf_thread_t *p_intf = GtkGetIntf( widget );
315 vlc_mutex_lock( &p_intf->change_lock );
316 p_intf->p_vlc->b_die = VLC_TRUE;
317 vlc_mutex_unlock( &p_intf->change_lock );
324 onFileOpen (GtkButton *button,
327 intf_thread_t *p_intf = GtkGetIntf( GTK_WIDGET( button ) );
330 if (p_intf->p_sys->p_notebook)
332 gtk_widget_show( GTK_WIDGET(p_intf->p_sys->p_notebook) );
333 gtk_notebook_set_page(p_intf->p_sys->p_notebook,0);
335 if (p_intf->p_sys->p_mediabook)
337 gtk_widget_show( GTK_WIDGET(p_intf->p_sys->p_mediabook) );
338 gtk_notebook_set_page(p_intf->p_sys->p_mediabook,0);
340 gdk_window_raise( p_intf->p_sys->p_window->window );
341 if (p_intf->p_sys->p_tvfile)
343 /* Get new directory listing */
344 list = gtk_list_store_new (5,
350 ReadDirectory(p_intf, list, ".");
352 /* Update TreeView */
353 gtk_tree_view_set_model(p_intf->p_sys->p_tvfile, (GtkTreeModel*) list);
359 onPlaylist (GtkButton *button,
362 intf_thread_t *p_intf = GtkGetIntf( GTK_WIDGET(button) );
365 if (p_intf->p_sys->p_notebook)
367 gtk_widget_show( GTK_WIDGET(p_intf->p_sys->p_notebook) );
368 gtk_notebook_set_page(p_intf->p_sys->p_notebook,1);
370 gdk_window_raise( p_intf->p_sys->p_window->window );
375 onPreferences (GtkButton *button,
378 intf_thread_t *p_intf = GtkGetIntf( GTK_WIDGET( button ) );
380 if (p_intf->p_sys->p_notebook)
382 gtk_widget_show( GTK_WIDGET(p_intf->p_sys->p_notebook) );
383 gtk_notebook_set_page(p_intf->p_sys->p_notebook,2);
385 gdk_window_raise( p_intf->p_sys->p_window->window );
390 onRewind (GtkButton *button,
393 intf_thread_t * p_intf = GtkGetIntf( button );
395 if( p_intf->p_sys->p_input != NULL )
397 input_SetStatus( p_intf->p_sys->p_input, INPUT_STATUS_SLOWER );
403 onPause (GtkButton *button,
406 intf_thread_t * p_intf = GtkGetIntf( button );
408 if( p_intf->p_sys->p_input != NULL )
410 input_SetStatus( p_intf->p_sys->p_input, INPUT_STATUS_PAUSE );
416 onPlay (GtkButton *button,
419 intf_thread_t * p_intf = GtkGetIntf( GTK_WIDGET( button ) );
420 playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
422 if( p_playlist == NULL )
424 /* Display open page */
425 onFileOpen(button,user_data);
428 /* If the playlist is empty, open a file requester instead */
429 vlc_mutex_lock( &p_playlist->object_lock );
430 if( p_playlist->i_size )
432 vlc_mutex_unlock( &p_playlist->object_lock );
433 playlist_Play( p_playlist );
434 vlc_object_release( p_playlist );
435 gdk_window_lower( p_intf->p_sys->p_window->window );
439 vlc_mutex_unlock( &p_playlist->object_lock );
440 vlc_object_release( p_playlist );
441 /* Display open page */
442 onFileOpen(button,user_data);
448 onStop (GtkButton *button,
451 intf_thread_t * p_intf = GtkGetIntf( GTK_WIDGET( button ) );
452 playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
456 playlist_Stop( p_playlist );
457 vlc_object_release( p_playlist );
458 gdk_window_raise( p_intf->p_sys->p_window->window );
464 onForward (GtkButton *button,
467 intf_thread_t * p_intf = GtkGetIntf( button );
469 if( p_intf->p_sys->p_input != NULL )
471 input_SetStatus( p_intf->p_sys->p_input, INPUT_STATUS_FASTER );
477 onAbout (GtkButton *button,
480 intf_thread_t *p_intf = GtkGetIntf( GTK_WIDGET(button) );
483 if (p_intf->p_sys->p_notebook)
485 gtk_widget_show( GTK_WIDGET(p_intf->p_sys->p_notebook) );
486 gtk_notebook_set_page(p_intf->p_sys->p_notebook,3);
488 gdk_window_raise( p_intf->p_sys->p_window->window );
493 SliderRelease (GtkWidget *widget,
494 GdkEventButton *event,
497 intf_thread_t *p_intf = GtkGetIntf( widget );
499 vlc_mutex_lock( &p_intf->change_lock );
500 p_intf->p_sys->b_slider_free = 1;
501 vlc_mutex_unlock( &p_intf->change_lock );
508 SliderPress (GtkWidget *widget,
509 GdkEventButton *event,
512 intf_thread_t *p_intf = GtkGetIntf( widget );
514 vlc_mutex_lock( &p_intf->change_lock );
515 p_intf->p_sys->b_slider_free = 0;
516 vlc_mutex_unlock( &p_intf->change_lock );
523 onFileListRow (GtkTreeView *treeview,
525 GtkTreeViewColumn *column,
528 g_print("onFileListRow\n");
533 onFileListColumns (GtkTreeView *treeview,
536 g_print("onFileListColumn\n");
541 onFileListRowSelected (GtkTreeView *treeview,
542 gboolean start_editing,
545 g_print("onFileListRowSelected\n");
551 onAddFileToPlaylist (GtkButton *button,
559 onEntryMRLChanged (GtkEditable *editable,
562 g_print("onMRLChanged\n");
567 onEntryMRLEditingDone (GtkCellEditable *celleditable,
570 g_print("onMRLEditingDone\n");
575 onNetworkPortChanged (GtkEditable *editable,
583 onEntryNetworkPortEditingDone (GtkCellEditable *celleditable,
591 onNetworkAddressChanged (GtkEditable *editable,
599 onEntryNetworkAddressEditingDone (GtkCellEditable *celleditable,
607 onNetworkTypeChanged (GtkEditable *editable,
615 onEntryNetworkTypeEditingDone (GtkCellEditable *celleditable,
623 onProtocolTypeChanged (GtkEditable *editable,
631 onEntryProtocolTypeEditingDone (GtkCellEditable *celleditable,
639 onMRLTypeChanged (GtkEditable *editable,
647 onEntryMRLTypeEditingDone (GtkCellEditable *celleditable,
655 onStreamTypeChanged (GtkEditable *editable,
663 onEntryStreamTypeEditingDone (GtkCellEditable *celleditable,
671 onAddNetworkPlaylist (GtkButton *button,
679 onV4LAudioChanged (GtkEditable *editable,
687 onEntryV4LAudioEditingDone (GtkCellEditable *celleditable,
695 onV4LVideoChanged (GtkEditable *editable,
703 onEntryV4LVideoEditingDone (GtkCellEditable *celleditable,
711 onAddCameraToPlaylist (GtkButton *button,
719 onVideoDeviceChanged (GtkEditable *editable,
727 onEntryVideoDeviceEditingDone (GtkCellEditable *celleditable,
735 onVideoCodecChanged (GtkEditable *editable,
743 onEntryVideoCodecEditingDone (GtkCellEditable *celleditable,
751 onVideoBitrateChanged (GtkEditable *editable,
759 onVideoBitrateEditingDone (GtkCellEditable *celleditable,
767 onAudioDeviceChanged (GtkEditable *editable,
775 onEntryAudioDeviceEditingDone (GtkCellEditable *celleditable,
783 onAudioCodecChanged (GtkEditable *editable,
791 onEntryAudioCodecEditingDone (GtkCellEditable *celleditable,
799 onAudioBitrateChanged (GtkEditable *editable,
807 onAudioBitrateEditingDone (GtkCellEditable *celleditable,
815 onAddServerToPlaylist (GtkButton *button,
823 PlaylistEvent (GtkWidget *widget,
827 g_print("onPlaylistEvent\n");
833 onPlaylistColumnsChanged (GtkTreeView *treeview,
836 g_print("onPlaylistColumnsChanged\n");
841 onPlaylistRowSelected (GtkTreeView *treeview,
842 gboolean start_editing,
845 g_print("onPlaylistRowSelected\n");
851 onPlaylistRow (GtkTreeView *treeview,
853 GtkTreeViewColumn *column,
856 g_print("onPlaylistRow\n");
861 onUpdatePlaylist (GtkButton *button,
869 onDeletePlaylist (GtkButton *button,
877 onClearPlaylist (GtkButton *button,
885 onPreferenceSave (GtkButton *button,
893 onPreferenceApply (GtkButton *button,
901 onPreferenceCancel (GtkButton *button,