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.19 2003/11/30 11:22:29 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 */
47 #include "pda_callbacks.h"
48 #include "pda_interface.h"
49 #include "pda_support.h"
52 #define VLC_MAX_MRL 256
54 static char *get_file_perms(struct stat st);
56 /*****************************************************************************
57 * Useful function to retrieve p_intf
58 ****************************************************************************/
59 void * E_(__GtkGetIntf)( GtkWidget * widget )
63 if( GTK_IS_MENU_ITEM( widget ) )
65 /* Look for a GTK_MENU */
66 while( widget->parent && !GTK_IS_MENU( widget ) )
68 widget = widget->parent;
71 /* Maybe this one has the data */
72 p_data = gtk_object_get_data( GTK_OBJECT( widget ), "p_intf" );
78 /* Otherwise, the parent widget has it */
79 widget = gtk_menu_get_attach_widget( GTK_MENU( widget ) );
82 /* We look for the top widget */
83 widget = gtk_widget_get_toplevel( GTK_WIDGET( widget ) );
85 p_data = gtk_object_get_data( GTK_OBJECT( widget ), "p_intf" );
90 void PlaylistAddItem(GtkWidget *widget, gchar *name)
92 intf_thread_t *p_intf = GtkGetIntf( widget );
93 playlist_t *p_playlist;
94 GtkTreeView *p_tvplaylist = NULL;
96 p_playlist = (playlist_t *)
97 vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
99 if( p_playlist == NULL)
100 { /* Bail out when VLC's playlist object is not found. */
104 /* Add to playlist object. */
105 p_tvplaylist = (GtkTreeView *) lookup_widget( GTK_WIDGET(widget), "tvPlaylist");
108 GtkTreeModel *p_play_model;
109 GtkTreeIter p_play_iter;
111 p_play_model = gtk_tree_view_get_model(p_tvplaylist);
115 /* Add a new row to the playlist treeview model */
116 gtk_list_store_append (GTK_LIST_STORE(p_play_model), &p_play_iter);
117 gtk_list_store_set (GTK_LIST_STORE(p_play_model), &p_play_iter,
118 0, name, /* Add path to it !!! */
120 2, p_playlist->i_size, /* Hidden index. */
123 /* Add to VLC's playlist */
125 if (p_intf->p_sys->b_autoplayfile)
127 playlist_Add( p_playlist, (const char*)name, 0, 0,
128 PLAYLIST_APPEND | PLAYLIST_GO, PLAYLIST_END);
133 playlist_Add( p_playlist, (const char*)name, 0, 0,
134 PLAYLIST_APPEND, PLAYLIST_END );
138 vlc_object_release( p_playlist );
141 void PlaylistRebuildListStore( GtkListStore * p_list, playlist_t * p_playlist )
145 gchar * ppsz_text[2];
151 vlc_mutex_lock( &p_playlist->object_lock );
152 for( i_dummy = 0; i_dummy < p_playlist->i_size ; i_dummy++ )
154 ppsz_text[0] = p_playlist->pp_items[i_dummy]->psz_name;
155 ppsz_text[1] = "no info";
156 gtk_list_store_append (p_list, &iter);
157 gtk_list_store_set (p_list, &iter,
160 2, i_dummy, /* Hidden index */
163 vlc_mutex_unlock( &p_playlist->object_lock );
166 /*****************************************************************
167 * Read directory helper function.
168 ****************************************************************/
169 void ReadDirectory(intf_thread_t *p_intf, GtkListStore *p_list, char *psz_dir )
172 struct dirent **namelist;
178 msg_Dbg(p_intf, "Changing to dir %s", psz_dir);
181 status = chdir(psz_dir);
183 msg_Dbg(p_intf, "permision denied" );
185 n = scandir(".", &namelist, 0, alphasort);
194 if (lstat("..", &st)==0)
197 pw = getpwuid(st.st_uid);
198 grp = getgrgid(st.st_gid);
200 /* XXX : kludge temporaire pour yopy */
202 ppsz_text[1] = get_file_perms(st);
203 ppsz_text[2] = pw->pw_name;
204 ppsz_text[3] = grp->gr_name;
206 /* Add a new row to the model */
207 gtk_list_store_append (p_list, &iter);
208 gtk_list_store_set (p_list, &iter,
216 if (ppsz_text[1]) free(ppsz_text[1]);
221 if ((namelist[i]->d_name[0] != '.') &&
222 (lstat(namelist[i]->d_name, &st)==0))
225 pw = getpwuid(st.st_uid);
226 grp = getgrgid(st.st_gid);
228 /* This is a list of strings. */
229 ppsz_text[0] = namelist[i]->d_name;
230 ppsz_text[1] = get_file_perms(st);
231 ppsz_text[2] = pw->pw_name;
232 ppsz_text[3] = grp->gr_name;
234 msg_Dbg(p_intf, "(%d) file: %s permission: %s user: %s group: %s", i, ppsz_text[0], ppsz_text[1], ppsz_text[2], ppsz_text[3] );
236 gtk_list_store_append (p_list, &iter);
237 gtk_list_store_set (p_list, &iter,
245 if (ppsz_text[1]) free(ppsz_text[1]);
252 static char *get_file_perms(const struct stat st)
256 perm = (char *) malloc(sizeof(char)*10);
257 strncpy( perm, "----------", sizeof("----------"));
259 /* determine permission modes */
260 if (S_ISLNK(st.st_mode))
262 else if (S_ISDIR(st.st_mode))
264 else if (S_ISCHR(st.st_mode))
266 else if (S_ISBLK(st.st_mode))
268 else if (S_ISFIFO(st.st_mode))
270 else if (S_ISSOCK(st.st_mode))
272 else if (S_ISREG(st.st_mode))
274 else /* Unknown type is an error */
276 /* Get file permissions */
278 if (st.st_mode & S_IRUSR)
280 if (st.st_mode & S_IWUSR)
282 if (st.st_mode & S_IXUSR)
284 if (st.st_mode & S_ISUID)
289 else if (st.st_mode & S_ISUID)
292 if (st.st_mode & S_IRGRP)
294 if (st.st_mode & S_IWGRP)
296 if (st.st_mode & S_IXGRP)
298 if (st.st_mode & S_ISGID)
303 else if (st.st_mode & S_ISGID)
306 if (st.st_mode & S_IROTH)
308 if (st.st_mode & S_IWOTH)
310 if (st.st_mode & S_IXOTH)
313 if (st.st_mode &S_ISVTX)
318 else if (st.st_mode &S_ISVTX)
325 * Main interface callbacks
329 onPDADeleteEvent (GtkWidget *widget,
333 intf_thread_t *p_intf = GtkGetIntf( widget );
335 vlc_mutex_lock( &p_intf->change_lock );
336 p_intf->p_vlc->b_die = VLC_TRUE;
337 vlc_mutex_unlock( &p_intf->change_lock );
338 msg_Dbg( p_intf, "about to exit vlc ... signalled" );
345 onRewind (GtkButton *button,
348 intf_thread_t * p_intf = GtkGetIntf( button );
350 if (p_intf->p_sys->p_input != NULL)
352 input_SetStatus( p_intf->p_sys->p_input, INPUT_STATUS_SLOWER );
358 onPause (GtkButton *button,
361 intf_thread_t * p_intf = GtkGetIntf( button );
363 if (p_intf->p_sys->p_input != NULL)
365 input_SetStatus( p_intf->p_sys->p_input, INPUT_STATUS_PAUSE );
371 onPlay (GtkButton *button,
374 intf_thread_t * p_intf = GtkGetIntf( GTK_WIDGET( button ) );
375 playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
379 vlc_mutex_lock( &p_playlist->object_lock );
380 if (p_playlist->i_size)
382 vlc_mutex_unlock( &p_playlist->object_lock );
383 playlist_Play( p_playlist );
387 vlc_mutex_unlock( &p_playlist->object_lock );
389 vlc_object_release( p_playlist );
395 onStop (GtkButton *button,
398 intf_thread_t * p_intf = GtkGetIntf( GTK_WIDGET( button ) );
399 playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
403 playlist_Stop( p_playlist );
404 vlc_object_release( p_playlist );
410 onForward (GtkButton *button,
413 intf_thread_t *p_intf = GtkGetIntf( button );
415 if (p_intf->p_sys->p_input != NULL)
417 input_SetStatus( p_intf->p_sys->p_input, INPUT_STATUS_FASTER );
423 onAbout (GtkButton *button,
426 intf_thread_t *p_intf = GtkGetIntf( GTK_WIDGET(button) );
429 if (p_intf->p_sys->p_notebook)
431 gtk_widget_show( GTK_WIDGET(p_intf->p_sys->p_notebook) );
432 gtk_notebook_set_page(p_intf->p_sys->p_notebook,6);
438 SliderRelease (GtkWidget *widget,
439 GdkEventButton *event,
442 intf_thread_t *p_intf = GtkGetIntf( widget );
444 vlc_mutex_lock( &p_intf->change_lock );
445 p_intf->p_sys->b_slider_free = 1;
446 vlc_mutex_unlock( &p_intf->change_lock );
453 SliderPress (GtkWidget *widget,
454 GdkEventButton *event,
457 intf_thread_t *p_intf = GtkGetIntf( widget );
459 vlc_mutex_lock( &p_intf->change_lock );
460 p_intf->p_sys->b_slider_free = 0;
461 vlc_mutex_unlock( &p_intf->change_lock );
466 void addSelectedToPlaylist(GtkTreeModel *model,
473 gtk_tree_model_get(model, iter, 0, &filename, -1);
475 PlaylistAddItem(GTK_WIDGET(userdata), filename);
479 onFileListRow (GtkTreeView *treeview,
481 GtkTreeViewColumn *column,
484 intf_thread_t *p_intf = GtkGetIntf( GTK_WIDGET(treeview) );
485 GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview);
487 if (gtk_tree_selection_count_selected_rows(selection) == 1)
494 /* This might be a directory selection */
495 model = gtk_tree_view_get_model(treeview);
498 msg_Err(p_intf, "PDA: Filelist model contains a NULL pointer\n" );
501 if (!gtk_tree_model_get_iter(model, &iter, path))
503 msg_Err( p_intf, "PDA: Could not get iter from model" );
507 gtk_tree_model_get(model, &iter, 0, &filename, -1);
508 if (stat((char*)filename, &st)==0)
510 if (S_ISDIR(st.st_mode))
512 GtkListStore *p_model = NULL;
514 /* Get new directory listing */
515 p_model = gtk_list_store_new (5,
523 ReadDirectory(p_intf, p_model, filename);
525 /* Update TreeView with new model */
526 gtk_tree_view_set_model(treeview, (GtkTreeModel*) p_model);
527 g_object_unref(p_model);
532 gtk_tree_selection_selected_foreach(selection, (GtkTreeSelectionForeachFunc) &addSelectedToPlaylist, (gpointer) treeview);
538 gtk_tree_selection_selected_foreach(selection, (GtkTreeSelectionForeachFunc) &addSelectedToPlaylist, (gpointer) treeview);
543 onAddFileToPlaylist (GtkButton *button,
546 GtkTreeView *treeview = NULL;
548 treeview = (GtkTreeView *) lookup_widget( GTK_WIDGET(button), "tvFileList");
551 GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview);
553 gtk_tree_selection_selected_foreach(selection, (GtkTreeSelectionForeachFunc) &addSelectedToPlaylist, (gpointer) treeview);
559 NetworkBuildMRL (GtkEditable *editable,
562 intf_thread_t *p_intf = GtkGetIntf( GTK_WIDGET(editable) );
563 GtkSpinButton *networkPort = NULL;
564 GtkEntry *entryMRL = NULL;
565 GtkEntry *networkType = NULL;
566 GtkEntry *networkAddress = NULL;
567 GtkEntry *networkProtocol = NULL;
568 const gchar *mrlNetworkType;
569 const gchar *mrlAddress;
570 const gchar *mrlProtocol;
572 char text[VLC_MAX_MRL];
575 entryMRL = (GtkEntry*) lookup_widget( GTK_WIDGET(editable), "entryMRL" );
577 networkType = (GtkEntry*) lookup_widget( GTK_WIDGET(editable), "entryNetworkType" );
578 networkAddress = (GtkEntry*) lookup_widget( GTK_WIDGET(editable), "entryNetworkAddress" );
579 networkPort = (GtkSpinButton*) lookup_widget( GTK_WIDGET(editable), "entryNetworkPort" );
580 networkProtocol = (GtkEntry*) lookup_widget( GTK_WIDGET(editable), "entryNetworkProtocolType" );
582 mrlNetworkType = gtk_entry_get_text(GTK_ENTRY(networkType));
583 mrlAddress = gtk_entry_get_text(GTK_ENTRY(networkAddress));
584 mrlPort = gtk_spin_button_get_value_as_int(networkPort);
585 mrlProtocol = gtk_entry_get_text(GTK_ENTRY(networkProtocol));
587 /* Build MRL from parts ;-) */
588 pos = snprintf( &text[0], VLC_MAX_MRL, "%s://", (char*)mrlProtocol);
589 if (strncasecmp( (char*)mrlNetworkType, "multicast",9)==0)
591 pos += snprintf( &text[pos], VLC_MAX_MRL - pos, "@" );
593 pos += snprintf( &text[pos], VLC_MAX_MRL - pos, "%s:%d", (char*)mrlAddress, (int)mrlPort );
595 if (pos >= VLC_MAX_MRL)
597 text[VLC_MAX_MRL-1]='\0';
598 msg_Err( p_intf, "Media Resource Locator is truncated to: %s", text);
601 gtk_entry_set_text(entryMRL,text);
605 onAddNetworkPlaylist (GtkButton *button,
608 GtkEntry *p_mrl = NULL;
609 const gchar *mrl_name;
611 p_mrl = (GtkEntry*) lookup_widget(GTK_WIDGET(button),"entryMRL" );
614 mrl_name = gtk_entry_get_text(p_mrl);
616 PlaylistAddItem(GTK_WIDGET(button), (gchar *)mrl_name);
622 onAddCameraToPlaylist (GtkButton *button,
625 intf_thread_t *p_intf = GtkGetIntf( button );
627 GtkSpinButton *entryV4LChannel = NULL;
628 GtkSpinButton *entryV4LFrequency = NULL;
629 GtkSpinButton *entryV4LSampleRate = NULL;
630 GtkSpinButton *entryV4LQuality = NULL;
631 GtkSpinButton *entryV4LTuner = NULL;
633 gint i_v4l_frequency;
634 gint i_v4l_samplerate;
638 GtkEntry *entryV4LVideoDevice = NULL;
639 GtkEntry *entryV4LAudioDevice = NULL;
640 GtkEntry *entryV4LNorm = NULL;
641 GtkEntry *entryV4LSize = NULL;
642 GtkEntry *entryV4LSoundDirection = NULL;
643 const gchar *p_v4l_video_device;
644 const gchar *p_v4l_audio_device;
645 const gchar *p_v4l_norm;
646 const gchar *p_v4l_size;
647 const gchar *p_v4l_sound_direction;
650 GtkCheckButton *checkV4LMJPEG = NULL;
651 GtkSpinButton *entryV4LDecimation = NULL;
652 gboolean b_v4l_mjpeg;
653 gint i_v4l_decimation;
656 char v4l_mrl[VLC_MAX_MRL];
659 pos = snprintf( &v4l_mrl[0], VLC_MAX_MRL, "v4l://");
661 entryV4LChannel = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryV4LChannel" );
662 entryV4LFrequency = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryV4LFrequency" );
663 entryV4LSampleRate = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryV4LSampleRate" );
664 entryV4LQuality = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryV4LQuality" );
665 entryV4LTuner = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryV4LTuner" );
667 entryV4LVideoDevice = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryV4LVideoDevice" );
668 entryV4LAudioDevice = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryV4LAudioDevice" );
669 entryV4LNorm = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryV4LNorm" );
670 entryV4LSize = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryV4LSize" );
671 entryV4LSoundDirection = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryV4LSoundDirection" );
673 i_v4l_channel = gtk_spin_button_get_value_as_int(entryV4LChannel);
674 i_v4l_frequency = gtk_spin_button_get_value_as_int(entryV4LFrequency);
675 i_v4l_samplerate = gtk_spin_button_get_value_as_int(entryV4LSampleRate);
676 i_v4l_quality = gtk_spin_button_get_value_as_int(entryV4LQuality);
677 i_v4l_tuner = gtk_spin_button_get_value_as_int(entryV4LTuner);
679 p_v4l_video_device = gtk_entry_get_text(GTK_ENTRY(entryV4LVideoDevice));
680 p_v4l_audio_device = gtk_entry_get_text(GTK_ENTRY(entryV4LAudioDevice));
681 p_v4l_norm = gtk_entry_get_text(GTK_ENTRY(entryV4LNorm));
682 p_v4l_size = gtk_entry_get_text(GTK_ENTRY(entryV4LSize));
683 p_v4l_sound_direction = gtk_entry_get_text(GTK_ENTRY(entryV4LSoundDirection));
685 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":%s", (char*)p_v4l_video_device );
686 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":adev=%s", (char*)p_v4l_audio_device );
687 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":norm=%s", (char*)p_v4l_norm );
688 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":size=%s", (char*)p_v4l_size );
689 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":%s", (char*)p_v4l_sound_direction );
691 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":channel=%d", (int)i_v4l_channel );
692 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":frequency=%d", (int)i_v4l_frequency );
693 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":samplerate=%d", (int)i_v4l_samplerate );
694 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":quality=%d", (int)i_v4l_quality );
695 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":tuner=%d", (int)i_v4l_tuner );
698 checkV4LMJPEG = (GtkCheckButton*) lookup_widget( GTK_WIDGET(button), "checkV4LMJPEG" );
699 b_v4l_mjpeg = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkV4LMJPEG));
702 entryV4LDecimation = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryV4LDecimation" );
703 i_v4l_decimation = gtk_spin_button_get_value_as_int(entryV4LDecimation);
704 pos += snprintf( &v4l_mrl[pos], VLC_MAX_MRL - pos, ":mjpeg:%d", (int)i_v4l_decimation );
708 if (pos >= VLC_MAX_MRL)
710 v4l_mrl[VLC_MAX_MRL-1]='\0';
711 msg_Err(p_intf, "Media Resource Locator is truncated to: %s", v4l_mrl);
714 PlaylistAddItem(GTK_WIDGET(button), (gchar*) &v4l_mrl);
719 PlaylistEvent (GtkWidget *widget,
728 onPlaylistColumnsChanged (GtkTreeView *treeview,
735 onPlaylistRowSelected (GtkTreeView *treeview,
736 gboolean start_editing,
744 onPlaylistRow (GtkTreeView *treeview,
746 GtkTreeViewColumn *column,
753 onUpdatePlaylist (GtkButton *button,
756 intf_thread_t * p_intf = GtkGetIntf( button );
757 playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
759 GtkTreeView *p_tvplaylist = NULL;
761 if( p_playlist == NULL )
766 p_tvplaylist = (GtkTreeView*) lookup_widget( GTK_WIDGET(button), "tvPlaylist");
769 GtkListStore *p_model = NULL;
771 /* Rebuild the playlist then. */
772 p_model = gtk_list_store_new (3,
773 G_TYPE_STRING, /* Filename */
774 G_TYPE_STRING, /* Time */
775 G_TYPE_UINT); /* Hidden field */
778 PlaylistRebuildListStore(p_model, p_playlist);
779 gtk_tree_view_set_model(GTK_TREE_VIEW(p_tvplaylist), GTK_TREE_MODEL(p_model));
780 g_object_unref(p_model);
783 vlc_object_release( p_playlist );
787 onDeletePlaylist (GtkButton *button,
790 intf_thread_t *p_intf = GtkGetIntf( button );
791 playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
793 GtkTreeView *p_tvplaylist;
795 /* Delete an arbitrary item from the playlist */
796 p_tvplaylist = (GtkTreeView *) lookup_widget( GTK_WIDGET(button), "tvPlaylist" );
797 if (p_tvplaylist != NULL)
799 GList *p_rows = NULL;
801 GtkTreeModel *p_model = NULL;
802 GtkTreeSelection *p_selection = gtk_tree_view_get_selection(p_tvplaylist);
804 p_model = gtk_tree_view_get_model(p_tvplaylist);
807 p_rows = gtk_tree_selection_get_selected_rows(p_selection, &p_model);
809 if( g_list_length( p_rows ) )
811 /* reverse-sort so that we can delete from the furthest
812 * to the closest item to delete...
814 p_rows = g_list_reverse( p_rows );
817 for (p_node=p_rows; p_node!=NULL; p_node = p_node->next)
820 GtkTreePath *p_path = NULL;
822 p_path = (GtkTreePath *)p_node->data;
825 if (gtk_tree_model_get_iter(p_model, &iter, p_path))
829 gtk_tree_model_get(p_model, &iter, 2, &item, -1);
830 playlist_Delete(p_playlist, item);
834 g_list_foreach (p_rows, gtk_tree_path_free, NULL);
835 g_list_free (p_rows);
838 /* Rebuild the playlist then. */
839 p_model = gtk_list_store_new (3,
840 G_TYPE_STRING, /* Filename */
841 G_TYPE_STRING, /* Time */
842 G_TYPE_UINT); /* Hidden field */
845 PlaylistRebuildListStore(GTK_LIST_STORE(p_model), p_playlist);
846 gtk_tree_view_set_model(GTK_TREE_VIEW(p_tvplaylist), GTK_TREE_MODEL(p_model));
847 g_object_unref(p_model);
850 vlc_object_release( p_playlist );
855 onClearPlaylist (GtkButton *button,
858 intf_thread_t *p_intf = GtkGetIntf( button );
859 playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
861 GtkTreeView *p_tvplaylist;
864 if( p_playlist == NULL )
869 for(item = p_playlist->i_size - 1; item >= 0 ;item-- )
871 playlist_Delete( p_playlist, item);
873 vlc_object_release( p_playlist );
875 // Remove all entries from the Playlist widget.
876 p_tvplaylist = (GtkTreeView*) lookup_widget( GTK_WIDGET(button), "tvPlaylist");
879 GtkTreeModel *p_play_model;
881 p_play_model = gtk_tree_view_get_model(p_tvplaylist);
884 gtk_list_store_clear(GTK_LIST_STORE(p_play_model));
891 onPreferenceSave (GtkButton *button,
895 intf_thread_t *p_intf = GtkGetIntf( button );
897 msg_Dbg(p_intf, "Preferences Save" );
898 config_SaveConfigFile( p_intf, NULL );
904 onPreferenceApply (GtkButton *button,
908 intf_thread_t *p_intf = GtkGetIntf( button );
910 msg_Dbg(p_intf, "Preferences Apply" );
916 onPreferenceCancel (GtkButton *button,
920 intf_thread_t *p_intf = GtkGetIntf( button );
922 msg_Dbg(p_intf, "Preferences Cancel" );
923 config_ResetAll( p_intf );
924 /* Cancel interface changes. */
925 config_SaveConfigFile( p_intf, NULL );
931 onAddTranscodeToPlaylist (GtkButton *button,
934 intf_thread_t *p_intf = GtkGetIntf( button );
936 GtkEntry *entryVideoCodec = NULL;
937 GtkSpinButton *entryVideoBitrate = NULL;
938 GtkSpinButton *entryVideoBitrateTolerance = NULL;
939 GtkSpinButton *entryVideoKeyFrameInterval = NULL;
940 GtkCheckButton *checkVideoDeinterlace = NULL;
941 GtkEntry *entryAudioCodec = NULL;
942 GtkSpinButton *entryAudioBitrate = NULL;
943 const gchar *p_video_codec;
944 gint i_video_bitrate;
945 gint i_video_bitrate_tolerance;
946 gint i_video_keyframe_interval;
947 gboolean b_video_deinterlace;
948 const gchar *p_audio_codec;
949 gint i_audio_bitrate;
951 GtkEntry *entryStdAccess = NULL;
952 GtkEntry *entryStdMuxer = NULL;
953 GtkEntry *entryStdURL = NULL;
954 GtkSpinButton *entryStdTTL = NULL;
955 const gchar *p_std_access;
956 const gchar *p_std_muxer;
957 const gchar *p_std_url;
960 gchar mrl[VLC_MAX_MRL];
963 pos = snprintf( &mrl[0], VLC_MAX_MRL, "--sout '#transcode{");
965 entryVideoCodec = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryVideoCodec" );
966 entryVideoBitrate = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryVideoBitrate" );
967 entryVideoBitrateTolerance = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryVideoBitrateTolerance" );
968 entryVideoKeyFrameInterval = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryVideoKeyFrameInterval" );
970 p_video_codec = gtk_entry_get_text(GTK_ENTRY(entryVideoCodec));
971 i_video_bitrate = gtk_spin_button_get_value_as_int(entryVideoBitrate);
972 i_video_bitrate_tolerance = gtk_spin_button_get_value_as_int(entryVideoBitrateTolerance);
973 i_video_keyframe_interval = gtk_spin_button_get_value_as_int(entryVideoKeyFrameInterval);
975 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "vcodec=%s,", (char*)p_video_codec );
976 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "vb=%d,", (int)i_video_bitrate );
977 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "vt=%d,", (int)i_video_bitrate_tolerance );
978 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "keyint=%d,", (int)i_video_keyframe_interval );
980 checkVideoDeinterlace = (GtkCheckButton*) lookup_widget( GTK_WIDGET(button), "checkVideoDeinterlace" );
981 b_video_deinterlace = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkVideoDeinterlace));
982 if (b_video_deinterlace)
984 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "deinterlace," );
986 entryAudioCodec = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryAudioCodec" );
987 entryAudioBitrate = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryAudioBitrate" );
989 p_audio_codec = gtk_entry_get_text(GTK_ENTRY(entryAudioCodec));
990 i_audio_bitrate = gtk_spin_button_get_value_as_int(entryAudioBitrate);
992 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "acodec=%s,", (char*)p_audio_codec );
993 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "ab=%d", (int)i_audio_bitrate );
995 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "}:std{" );
997 entryStdAccess = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryStdAccess" );
998 entryStdMuxer = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryStdMuxer" );
999 entryStdURL = (GtkEntry*) lookup_widget( GTK_WIDGET(button), "entryStdURL" );
1000 entryStdTTL = (GtkSpinButton*) lookup_widget( GTK_WIDGET(button), "entryStdTTL" );
1002 p_std_access = gtk_entry_get_text(GTK_ENTRY(entryStdAccess));
1003 p_std_muxer = gtk_entry_get_text(GTK_ENTRY(entryStdMuxer));
1004 p_std_url = gtk_entry_get_text(GTK_ENTRY(entryStdURL));
1006 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "access=%s,", (char*)p_std_access);
1007 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "mux=%s,", (char*)p_std_muxer);
1008 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "url=%s", (char*)p_std_url);
1009 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, "}'");
1011 i_std_ttl = gtk_spin_button_get_value_as_int(entryStdTTL);
1013 pos += snprintf( &mrl[pos], VLC_MAX_MRL - pos, " --ttl=%d", (int)i_std_ttl);
1015 if (pos >= VLC_MAX_MRL)
1017 mrl[VLC_MAX_MRL-1]='\0';
1018 msg_Err(p_intf, "Media Resource Locator is truncated to: %s", mrl );
1021 PlaylistAddItem(GTK_WIDGET(button), (gchar*) &mrl);