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.3 2003/11/07 07:59:00 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_stat(const char *path, uid_t *uid, gid_t *gid, off_t *size);
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);
181 msg_Dbg( p_intf, "updating interface" );
183 /* XXX : kludge temporaire pour yopy */
185 ppsz_text[1] = get_file_stat("..", &uid, &gid, &size);
190 /* Add a new row to the model */
191 gtk_list_store_append (p_list, &iter);
192 gtk_list_store_set (p_list, &iter,
200 if (ppsz_text[1]) free(ppsz_text[1]);
205 if (namelist[i]->d_name[0] != '.')
207 /* This is a list of strings. */
208 ppsz_text[0] = namelist[i]->d_name;
209 ppsz_text[1] = get_file_stat(namelist[i]->d_name, &uid, &gid, &size);
214 // msg_Dbg(p_intf, "(%d) file: %s permission: %s user: %ull group: %ull size: %ull", i, ppsz_text[0], ppsz_text[1], uid, gid, size );
215 gtk_list_store_append (p_list, &iter);
216 gtk_list_store_set (p_list, &iter,
224 if (ppsz_text[1]) free(ppsz_text[1]);
230 /* now switch to the "file" tab */
231 if (p_intf->p_sys->p_mediabook)
233 gtk_widget_show( GTK_WIDGET(p_intf->p_sys->p_mediabook) );
234 gtk_notebook_set_page(p_intf->p_sys->p_mediabook,0);
238 static char* get_file_stat(const char *path, uid_t *uid, gid_t *gid, off_t *size)
243 perm = (char *) malloc(sizeof(char)*10);
244 strncpy( perm, "----------", sizeof("----------"));
245 if (lstat(path, &st)==0)
247 /* user, group, filesize */
251 /* determine permission modes */
252 if (S_ISLNK(st.st_mode))
254 else if (S_ISDIR(st.st_mode))
256 else if (S_ISCHR(st.st_mode))
258 else if (S_ISBLK(st.st_mode))
260 else if (S_ISFIFO(st.st_mode))
262 else if (S_ISSOCK(st.st_mode))
264 else if (S_ISREG(st.st_mode))
266 else /* Unknown type is an error */
268 /* Get file permissions */
270 if (st.st_mode & S_IRUSR)
272 if (st.st_mode & S_IWUSR)
274 if (st.st_mode & S_IXUSR)
276 if (st.st_mode & S_ISUID)
281 else if (st.st_mode & S_ISUID)
284 if (st.st_mode & S_IRGRP)
286 if (st.st_mode & S_IWGRP)
288 if (st.st_mode & S_IXGRP)
290 if (st.st_mode & S_ISGID)
295 else if (st.st_mode & S_ISGID)
298 if (st.st_mode & S_IROTH)
300 if (st.st_mode & S_IWOTH)
302 if (st.st_mode & S_IXOTH)
305 if (st.st_mode &S_ISVTX)
310 else if (st.st_mode &S_ISVTX)
317 * Main interface callbacks
321 onPDADeleteEvent (GtkWidget *widget,
325 intf_thread_t *p_intf = GtkGetIntf( widget );
327 msg_Dbg( p_intf, "about to exit vlc ... " );
328 vlc_mutex_lock( &p_intf->change_lock );
329 p_intf->p_vlc->b_die = VLC_TRUE;
330 vlc_mutex_unlock( &p_intf->change_lock );
331 msg_Dbg( p_intf, "about to exit vlc ... signalled" );
338 onFileOpen (GtkButton *button,
341 intf_thread_t *p_intf = GtkGetIntf( GTK_WIDGET( button ) );
344 if (p_intf->p_sys->p_notebook)
346 gtk_widget_show( GTK_WIDGET(p_intf->p_sys->p_notebook) );
347 gtk_notebook_set_page(p_intf->p_sys->p_notebook,0);
349 if (p_intf->p_sys->p_mediabook)
351 gtk_widget_show( GTK_WIDGET(p_intf->p_sys->p_mediabook) );
352 gtk_notebook_set_page(p_intf->p_sys->p_mediabook,0);
354 gdk_window_raise( p_intf->p_sys->p_window->window );
355 if (p_intf->p_sys->p_tvfile)
357 /* Get new directory listing */
358 list = gtk_list_store_new (5,
364 ReadDirectory(p_intf, list, ".");
366 /* Update TreeView */
367 gtk_tree_view_set_model(p_intf->p_sys->p_tvfile, (GtkTreeModel*) list);
368 g_object_unref(list);
369 gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(p_intf->p_sys->p_tvfile)),GTK_SELECTION_NONE);
375 onPlaylist (GtkButton *button,
378 intf_thread_t *p_intf = GtkGetIntf( GTK_WIDGET(button) );
381 if (p_intf->p_sys->p_notebook)
383 gtk_widget_show( GTK_WIDGET(p_intf->p_sys->p_notebook) );
384 gtk_notebook_set_page(p_intf->p_sys->p_notebook,1);
386 gdk_window_raise( p_intf->p_sys->p_window->window );
391 onPreferences (GtkButton *button,
394 intf_thread_t *p_intf = GtkGetIntf( GTK_WIDGET( button ) );
396 if (p_intf->p_sys->p_notebook)
398 gtk_widget_show( GTK_WIDGET(p_intf->p_sys->p_notebook) );
399 gtk_notebook_set_page(p_intf->p_sys->p_notebook,2);
401 gdk_window_raise( p_intf->p_sys->p_window->window );
406 onRewind (GtkButton *button,
409 intf_thread_t * p_intf = GtkGetIntf( button );
411 if( p_intf->p_sys->p_input != NULL )
413 input_SetStatus( p_intf->p_sys->p_input, INPUT_STATUS_SLOWER );
419 onPause (GtkButton *button,
422 intf_thread_t * p_intf = GtkGetIntf( button );
424 if( p_intf->p_sys->p_input != NULL )
426 input_SetStatus( p_intf->p_sys->p_input, INPUT_STATUS_PAUSE );
432 onPlay (GtkButton *button,
435 intf_thread_t * p_intf = GtkGetIntf( GTK_WIDGET( button ) );
436 playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
438 if( p_playlist == NULL )
440 /* Display open page */
441 onFileOpen(button,user_data);
444 /* If the playlist is empty, open a file requester instead */
445 vlc_mutex_lock( &p_playlist->object_lock );
446 if( p_playlist->i_size )
448 vlc_mutex_unlock( &p_playlist->object_lock );
449 playlist_Play( p_playlist );
450 vlc_object_release( p_playlist );
451 gdk_window_lower( p_intf->p_sys->p_window->window );
455 vlc_mutex_unlock( &p_playlist->object_lock );
456 vlc_object_release( p_playlist );
457 /* Display open page */
458 onFileOpen(button,user_data);
464 onStop (GtkButton *button,
467 intf_thread_t * p_intf = GtkGetIntf( GTK_WIDGET( button ) );
468 playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
472 playlist_Stop( p_playlist );
473 vlc_object_release( p_playlist );
474 gdk_window_raise( p_intf->p_sys->p_window->window );
480 onForward (GtkButton *button,
483 intf_thread_t * p_intf = GtkGetIntf( button );
485 if( p_intf->p_sys->p_input != NULL )
487 input_SetStatus( p_intf->p_sys->p_input, INPUT_STATUS_FASTER );
493 onAbout (GtkButton *button,
496 intf_thread_t *p_intf = GtkGetIntf( GTK_WIDGET(button) );
499 if (p_intf->p_sys->p_notebook)
501 gtk_widget_show( GTK_WIDGET(p_intf->p_sys->p_notebook) );
502 gtk_notebook_set_page(p_intf->p_sys->p_notebook,3);
504 gdk_window_raise( p_intf->p_sys->p_window->window );
509 SliderRelease (GtkWidget *widget,
510 GdkEventButton *event,
513 intf_thread_t *p_intf = GtkGetIntf( widget );
515 vlc_mutex_lock( &p_intf->change_lock );
516 p_intf->p_sys->b_slider_free = 1;
517 vlc_mutex_unlock( &p_intf->change_lock );
524 SliderPress (GtkWidget *widget,
525 GdkEventButton *event,
528 intf_thread_t *p_intf = GtkGetIntf( widget );
530 vlc_mutex_lock( &p_intf->change_lock );
531 p_intf->p_sys->b_slider_free = 0;
532 vlc_mutex_unlock( &p_intf->change_lock );
537 gboolean addSelectedToPlaylist(GtkTreeModel *model,
542 GtkTreeView *tvplaylist = NULL;
543 GtkTreeModel *play_model;
544 GtkTreeIter play_iter;
547 gtk_tree_model_get(model, iter, 0, &filename, -1);
548 g_print("selected %s\n", filename);
550 tvplaylist = (GtkTreeView *) lookup_widget( GTK_WIDGET(userdata), "tvPlaylist");
551 if (NULL != tvplaylist)
553 play_model = gtk_tree_view_get_model(tvplaylist);
554 /* Add a new row to the playlist treeview model */
555 gtk_list_store_append (play_model, &play_iter);
556 gtk_list_store_set (play_model, &play_iter,
557 0, filename, /* Add path to it !!! */
560 /* do we need to unref ?? */
563 // msg_Err(p_intf, "Error obtaining pointer to Play List");
564 g_print("Error obtaining pointer to Play List");
568 onFileListRow (GtkTreeView *treeview,
570 GtkTreeViewColumn *column,
573 GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview);
574 g_print("onFileListRow\n");
575 gtk_tree_selection_selected_foreach(selection, addSelectedToPlaylist, (gpointer) treeview);
580 onFileListColumns (GtkTreeView *treeview,
583 g_print("onFileListColumn\n");
588 onFileListRowSelected (GtkTreeView *treeview,
589 gboolean start_editing,
592 g_print("onFileListRowSelected\n");
598 onAddFileToPlaylist (GtkButton *button,
606 onEntryMRLChanged (GtkEditable *editable,
609 g_print("onMRLChanged\n");
614 onEntryMRLEditingDone (GtkCellEditable *celleditable,
617 g_print("onMRLEditingDone\n");
622 onNetworkPortChanged (GtkEditable *editable,
630 onEntryNetworkPortEditingDone (GtkCellEditable *celleditable,
638 onNetworkAddressChanged (GtkEditable *editable,
646 onEntryNetworkAddressEditingDone (GtkCellEditable *celleditable,
654 onNetworkTypeChanged (GtkEditable *editable,
662 onEntryNetworkTypeEditingDone (GtkCellEditable *celleditable,
670 onProtocolTypeChanged (GtkEditable *editable,
678 onEntryProtocolTypeEditingDone (GtkCellEditable *celleditable,
686 onMRLTypeChanged (GtkEditable *editable,
694 onEntryMRLTypeEditingDone (GtkCellEditable *celleditable,
702 onStreamTypeChanged (GtkEditable *editable,
710 onEntryStreamTypeEditingDone (GtkCellEditable *celleditable,
718 onAddNetworkPlaylist (GtkButton *button,
724 p_mrl = (GtkEntry*) lookup_widget(GTK_WIDGET(button),"" );
727 GtkTreeView *tvplaylist = NULL;
728 GtkTreeModel *play_model;
729 GtkTreeIter play_iter;
732 tvplaylist = (GtkTreeView *) lookup_widget( GTK_WIDGET(button), "tvPlaylist");
733 if (NULL != tvplaylist)
735 play_model = gtk_tree_view_get_model(tvplaylist);
736 /* Add a new row to the playlist treeview model */
737 gtk_list_store_append (play_model, &play_iter);
738 gtk_list_store_set (play_model, &play_iter,
739 0, name, /* Add path to it !!! */
742 /* do we need to unref ?? */
745 // msg_Err(p_intf, "Error obtaining pointer to Play List");
746 g_print("Error obtaining pointer to Play List");
753 onV4LAudioChanged (GtkEditable *editable,
761 onEntryV4LAudioEditingDone (GtkCellEditable *celleditable,
769 onV4LVideoChanged (GtkEditable *editable,
777 onEntryV4LVideoEditingDone (GtkCellEditable *celleditable,
785 onAddCameraToPlaylist (GtkButton *button,
793 onVideoDeviceChanged (GtkEditable *editable,
801 onEntryVideoDeviceEditingDone (GtkCellEditable *celleditable,
809 onVideoCodecChanged (GtkEditable *editable,
817 onEntryVideoCodecEditingDone (GtkCellEditable *celleditable,
825 onVideoBitrateChanged (GtkEditable *editable,
833 onVideoBitrateEditingDone (GtkCellEditable *celleditable,
841 onAudioDeviceChanged (GtkEditable *editable,
849 onEntryAudioDeviceEditingDone (GtkCellEditable *celleditable,
857 onAudioCodecChanged (GtkEditable *editable,
865 onEntryAudioCodecEditingDone (GtkCellEditable *celleditable,
873 onAudioBitrateChanged (GtkEditable *editable,
881 onAudioBitrateEditingDone (GtkCellEditable *celleditable,
889 onAddServerToPlaylist (GtkButton *button,
897 PlaylistEvent (GtkWidget *widget,
901 g_print("onPlaylistEvent\n");
907 onPlaylistColumnsChanged (GtkTreeView *treeview,
910 g_print("onPlaylistColumnsChanged\n");
915 onPlaylistRowSelected (GtkTreeView *treeview,
916 gboolean start_editing,
919 g_print("onPlaylistRowSelected\n");
925 onPlaylistRow (GtkTreeView *treeview,
927 GtkTreeViewColumn *column,
930 g_print("onPlaylistRow\n");
935 onUpdatePlaylist (GtkButton *button,
943 onDeletePlaylist (GtkButton *button,
951 onClearPlaylist (GtkButton *button,
959 onPreferenceSave (GtkButton *button,
967 onPreferenceApply (GtkButton *button,
975 onPreferenceCancel (GtkButton *button,