]> git.sesse.net Git - vlc/blob - modules/gui/pda/pda_callbacks.c
Implementing new PDA User Interface design using the GTK2 widget set. This interface...
[vlc] / modules / gui / pda / pda_callbacks.c
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 $
6  *
7  * Authors: Jean-Paul Saman <jpsaman@wxs.nl>
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., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
22  *****************************************************************************/
23
24 /*****************************************************************************
25  * Preamble
26  *****************************************************************************/
27 #include <sys/types.h>                                              /* off_t */
28 #include <stdlib.h>
29 #include <vlc/vlc.h>
30 #include <vlc/intf.h>
31 #include <vlc/vout.h>
32
33 #include <stdio.h>
34 #include <string.h>
35 #include <dirent.h>
36 #include <sys/stat.h>
37 #include <unistd.h>
38
39 #ifdef HAVE_CONFIG_H
40 #  include <config.h>
41 #endif
42
43 #include <gtk/gtk.h>
44
45 #include "pda_callbacks.h"
46 #include "pda_interface.h"
47 #include "pda_support.h"
48 #include "pda.h"
49
50 static char* get_file_perm(const char *path);
51
52 /*****************************************************************************
53  * Useful function to retrieve p_intf
54  ****************************************************************************/
55 void * E_(__GtkGetIntf)( GtkWidget * widget )
56 {
57     void *p_data;
58
59     if( GTK_IS_MENU_ITEM( widget ) )
60     {
61         /* Look for a GTK_MENU */
62         while( widget->parent && !GTK_IS_MENU( widget ) )
63         {
64             widget = widget->parent;
65         }
66
67         /* Maybe this one has the data */
68         p_data = gtk_object_get_data( GTK_OBJECT( widget ), "p_intf" );
69         if( p_data )
70         {
71             return p_data;
72         }
73
74         /* Otherwise, the parent widget has it */
75         widget = gtk_menu_get_attach_widget( GTK_MENU( widget ) );
76     }
77
78     /* We look for the top widget */
79     widget = gtk_widget_get_toplevel( GTK_WIDGET( widget ) );
80
81     p_data = gtk_object_get_data( GTK_OBJECT( widget ), "p_intf" );
82
83     return p_data;
84 }
85
86 void PlaylistRebuildListStore( GtkListStore * p_list, playlist_t * p_playlist )
87 {
88     GtkTreeIter iter;
89     int         i_dummy;
90     gchar *     ppsz_text[2];
91     GdkColor    red;
92     red.red     = 65535;
93     red.blue    = 0;
94     red.green   = 0;
95
96     vlc_mutex_lock( &p_playlist->object_lock );
97     for( i_dummy = p_playlist->i_size ; i_dummy-- ; )
98     {
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,
103                             0, ppsz_text[0],
104                             1, ppsz_text[1],
105                             -1);
106
107     }
108     vlc_mutex_unlock( &p_playlist->object_lock );
109 }
110
111 /*****************************************************************************
112  * Helper functions for URL changes in Media and Preferences notebook pages.
113  ****************************************************************************/
114 void MediaURLOpenChanged( GtkWidget *widget, gchar *psz_url )
115 {
116     intf_thread_t *p_intf = GtkGetIntf( widget );
117     playlist_t *p_playlist;
118     GtkListStore *p_liststore;
119
120     // Add p_url to playlist .... but how ?
121     p_playlist = (playlist_t *)
122              vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
123
124     if( p_playlist ==  NULL)
125     {
126         return;
127     }
128
129     if( p_playlist )
130     {
131         if (p_intf->p_sys->b_autoplayfile)
132         {
133             playlist_Add( p_playlist, (char*)psz_url, 0, 0,
134                           PLAYLIST_APPEND | PLAYLIST_GO, PLAYLIST_END);
135         }
136         else
137         {
138             playlist_Add( p_playlist, (char*)psz_url, 0, 0,
139                           PLAYLIST_APPEND, PLAYLIST_END );
140         }
141         vlc_object_release(  p_playlist );
142         msg_Dbg(p_intf, "MediaURLOpenChange: Populating GtkTreeView Playlist" );
143         p_liststore = gtk_list_store_new (2,
144                                    G_TYPE_STRING,
145                                    G_TYPE_STRING);
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);     
149     }
150 }
151
152 /*****************************************************************
153  * Read directory helper function.
154  ****************************************************************/
155 void ReadDirectory( intf_thread_t *p_intf, GtkListStore *p_list, char *psz_dir )
156 {
157 //    intf_thread_t *p_intf = GtkGetIntf( GTK_WIDGET(p_list) );
158     GtkTreeIter iter;
159     struct dirent **namelist;
160     int n=-1, status=-1;
161
162     msg_Dbg(p_intf, "changing to dir %s", psz_dir);
163     if (psz_dir)
164     {
165        status = chdir(psz_dir);
166        if (status<0)
167           msg_Err( p_intf, "permision denied" );
168     }
169     n = scandir(".", &namelist, 0, alphasort);
170
171     if (n<0)
172         perror("scandir");
173     else
174     {
175         int i;
176         gchar *ppsz_text[5];
177
178         msg_Dbg( p_intf, "updating interface" );
179
180         /* XXX : kludge temporaire pour yopy */
181         ppsz_text[0]="..";
182         ppsz_text[1] = get_file_perm("..");
183         ppsz_text[2] = "";
184         ppsz_text[3] = "";
185         ppsz_text[4] = "";
186
187         /* Add a new row to the model */
188         gtk_list_store_append (p_list, &iter);
189         gtk_list_store_set (p_list, &iter,
190                             0, ppsz_text[0],
191                             1, ppsz_text[1],
192                             2, ppsz_text[2],
193                             3, ppsz_text[3],
194                             4, ppsz_text[4],
195                             -1);
196
197         /* kludge */
198         for (i=0; i<n; i++)
199         {
200             if (namelist[i]->d_name[0] != '.')
201             {
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);
205                 ppsz_text[2] = "";
206                 ppsz_text[3] = "";
207                 ppsz_text[4] = "";
208
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,
212                                     0, ppsz_text[0],
213                                     1, ppsz_text[1],
214                                     2, ppsz_text[2],
215                                     3, ppsz_text[3],
216                                     4, ppsz_text[4],
217                                     -1);
218             }
219         }
220         free(namelist);
221     }
222
223     /* now switch to the "file" tab */
224     if (p_intf->p_sys->p_mediabook)
225     {
226        gtk_widget_show( GTK_WIDGET(p_intf->p_sys->p_mediabook) );
227        gtk_notebook_set_page(p_intf->p_sys->p_mediabook,0);
228     }
229 }
230
231 static char* get_file_perm(const char *path)
232 {
233     struct stat st;
234     char *perm;
235
236     perm = (char *) malloc(sizeof(char)*10);
237     strncpy( perm, "----------", sizeof("----------"));
238     if (lstat(path, &st)==0)
239     {
240         if (S_ISLNK(st.st_mode))
241             perm[0]= 'l';
242         else if (S_ISDIR(st.st_mode))
243             perm[0]= 'd';
244         else if (S_ISCHR(st.st_mode))
245             perm[0]= 'c';
246         else if (S_ISBLK(st.st_mode))
247             perm[0]= 'b';
248         else if (S_ISFIFO(st.st_mode))
249             perm[0]= 'f';
250         else if (S_ISSOCK(st.st_mode))
251             perm[0]= 's';
252         else if (S_ISREG(st.st_mode))
253             perm[0]= '-';
254         else /* Unknown type is an error */
255             perm[0]= '?';
256         /* Get file permissions */
257         /* User */
258         if (st.st_mode & S_IRUSR)
259             perm[1]= 'r';
260         if (st.st_mode & S_IWUSR)
261             perm[2]= 'w';
262         if (st.st_mode & S_IXUSR)
263         {
264             if (st.st_mode & S_ISUID)
265                 perm[3] = 's';
266             else
267                 perm[3]= 'x';
268         }
269         else if (st.st_mode & S_ISUID)
270             perm[3] = 'S';
271         /* Group */
272         if (st.st_mode & S_IRGRP)
273             perm[4]= 'r';
274         if (st.st_mode & S_IWGRP)
275             perm[5]= 'w';
276         if (st.st_mode & S_IXGRP)
277         {
278             if (st.st_mode & S_ISGID)
279                 perm[6] = 's';
280             else
281                 perm[6]= 'x';
282         }
283         else if (st.st_mode & S_ISGID)
284             perm[6] = 'S';
285         /* Other */
286         if (st.st_mode & S_IROTH)
287             perm[7]= 'r';
288         if (st.st_mode & S_IWOTH)
289             perm[8]= 'w';
290         if (st.st_mode & S_IXOTH)
291         {
292             // 'sticky' bit
293             if (st.st_mode &S_ISVTX)
294                 perm[9] = 't';
295             else
296                 perm[9]= 'x';
297         }
298         else if (st.st_mode &S_ISVTX)
299             perm[9]= 'T';
300     }
301     return perm;
302 }
303
304 /*
305  * Main interface callbacks
306  */
307
308 gboolean
309 onPDADeleteEvent                       (GtkWidget       *widget,
310                                         GdkEvent        *event,
311                                         gpointer         user_data)
312 {
313     intf_thread_t *p_intf = GtkGetIntf( widget );
314
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 );
318
319     return TRUE;
320 }
321
322
323 void
324 onFileOpen                             (GtkButton       *button,
325                                         gpointer         user_data)
326 {
327     intf_thread_t *p_intf = GtkGetIntf( GTK_WIDGET( button ) );
328     GtkListStore *list;
329
330     if (p_intf->p_sys->p_notebook)
331     {
332        gtk_widget_show( GTK_WIDGET(p_intf->p_sys->p_notebook) );
333        gtk_notebook_set_page(p_intf->p_sys->p_notebook,0);
334     }
335     if (p_intf->p_sys->p_mediabook)
336     {
337        gtk_widget_show( GTK_WIDGET(p_intf->p_sys->p_mediabook) );
338        gtk_notebook_set_page(p_intf->p_sys->p_mediabook,0);
339     }
340     gdk_window_raise( p_intf->p_sys->p_window->window );
341     if (p_intf->p_sys->p_tvfile)
342     {
343        /* Get new directory listing */
344        list = gtk_list_store_new (5,
345                                   G_TYPE_STRING,
346                                   G_TYPE_STRING,
347                                   G_TYPE_STRING,
348                                   G_TYPE_STRING,
349                                   G_TYPE_STRING);
350        ReadDirectory(p_intf, list, ".");
351
352        /* Update TreeView */
353        gtk_tree_view_set_model(p_intf->p_sys->p_tvfile, (GtkTreeModel*) list);  
354     }
355 }
356
357
358 void
359 onPlaylist                             (GtkButton       *button,
360                                         gpointer         user_data)
361 {
362     intf_thread_t *p_intf = GtkGetIntf( GTK_WIDGET(button) );
363
364     // Toggle notebook
365     if (p_intf->p_sys->p_notebook)
366     {
367         gtk_widget_show( GTK_WIDGET(p_intf->p_sys->p_notebook) );
368         gtk_notebook_set_page(p_intf->p_sys->p_notebook,1);
369     }
370     gdk_window_raise( p_intf->p_sys->p_window->window );
371 }
372
373
374 void
375 onPreferences                          (GtkButton       *button,
376                                         gpointer         user_data)
377 {
378     intf_thread_t *p_intf = GtkGetIntf( GTK_WIDGET( button ) );
379
380     if (p_intf->p_sys->p_notebook)
381     {
382        gtk_widget_show( GTK_WIDGET(p_intf->p_sys->p_notebook) );
383        gtk_notebook_set_page(p_intf->p_sys->p_notebook,2);
384     }
385     gdk_window_raise( p_intf->p_sys->p_window->window );
386 }
387
388
389 void
390 onRewind                               (GtkButton       *button,
391                                         gpointer         user_data)
392 {
393     intf_thread_t *  p_intf = GtkGetIntf( button );
394
395     if( p_intf->p_sys->p_input != NULL )
396     {
397         input_SetStatus( p_intf->p_sys->p_input, INPUT_STATUS_SLOWER );
398     }
399 }
400
401
402 void
403 onPause                                (GtkButton       *button,
404                                         gpointer         user_data)
405 {
406     intf_thread_t *  p_intf = GtkGetIntf( button );
407
408     if( p_intf->p_sys->p_input != NULL )
409     {
410         input_SetStatus( p_intf->p_sys->p_input, INPUT_STATUS_PAUSE );
411     }
412 }
413
414
415 void
416 onPlay                                 (GtkButton       *button,
417                                         gpointer         user_data)
418 {
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 );
421
422      if( p_playlist == NULL )
423      {
424          /* Display open page */
425          onFileOpen(button,user_data);
426      }
427
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 )
431      {
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 );
436      }
437      else
438      {
439          vlc_mutex_unlock( &p_playlist->object_lock );
440          vlc_object_release( p_playlist );
441          /* Display open page */
442          onFileOpen(button,user_data);
443     }
444 }
445
446
447 void
448 onStop                                 (GtkButton       *button,
449                                         gpointer         user_data)
450 {
451     intf_thread_t *  p_intf = GtkGetIntf( GTK_WIDGET( button ) );
452     playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
453                                                        FIND_ANYWHERE );
454     if( p_playlist)
455     {
456         playlist_Stop( p_playlist );
457         vlc_object_release( p_playlist );
458         gdk_window_raise( p_intf->p_sys->p_window->window );
459     }
460 }
461
462
463 void
464 onForward                              (GtkButton       *button,
465                                         gpointer         user_data)
466 {
467     intf_thread_t *  p_intf = GtkGetIntf( button );
468
469     if( p_intf->p_sys->p_input != NULL )
470     {
471         input_SetStatus( p_intf->p_sys->p_input, INPUT_STATUS_FASTER );
472     }
473 }
474
475
476 void
477 onAbout                                (GtkButton       *button,
478                                         gpointer         user_data)
479 {
480     intf_thread_t *p_intf = GtkGetIntf( GTK_WIDGET(button) );
481
482     // Toggle notebook
483     if (p_intf->p_sys->p_notebook)
484     {
485         gtk_widget_show( GTK_WIDGET(p_intf->p_sys->p_notebook) );
486         gtk_notebook_set_page(p_intf->p_sys->p_notebook,3);
487     }
488     gdk_window_raise( p_intf->p_sys->p_window->window );
489 }
490
491
492 gboolean
493 SliderRelease                          (GtkWidget       *widget,
494                                         GdkEventButton  *event,
495                                         gpointer         user_data)
496 {
497     intf_thread_t *p_intf = GtkGetIntf( widget );
498
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 );
502
503     return TRUE;
504 }
505
506
507 gboolean
508 SliderPress                            (GtkWidget       *widget,
509                                         GdkEventButton  *event,
510                                         gpointer         user_data)
511 {
512     intf_thread_t *p_intf = GtkGetIntf( widget );
513
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 );
517
518     return TRUE;
519 }
520
521
522 void
523 onFileListRow                          (GtkTreeView     *treeview,
524                                         GtkTreePath     *path,
525                                         GtkTreeViewColumn *column,
526                                         gpointer         user_data)
527 {
528     g_print("onFileListRow\n");
529 }
530
531
532 void
533 onFileListColumns                      (GtkTreeView     *treeview,
534                                         gpointer         user_data)
535 {
536     g_print("onFileListColumn\n");
537 }
538
539
540 gboolean
541 onFileListRowSelected                  (GtkTreeView     *treeview,
542                                         gboolean         start_editing,
543                                         gpointer         user_data)
544 {
545     g_print("onFileListRowSelected\n");
546     return FALSE;
547 }
548
549
550 void
551 onAddFileToPlaylist                    (GtkButton       *button,
552                                         gpointer         user_data)
553 {
554
555 }
556
557
558 void
559 onEntryMRLChanged                      (GtkEditable     *editable,
560                                         gpointer         user_data)
561 {
562     g_print("onMRLChanged\n");
563 }
564
565
566 void
567 onEntryMRLEditingDone                  (GtkCellEditable *celleditable,
568                                         gpointer         user_data)
569 {
570     g_print("onMRLEditingDone\n");
571 }
572
573
574 void
575 onNetworkPortChanged                   (GtkEditable     *editable,
576                                         gpointer         user_data)
577 {
578
579 }
580
581
582 void
583 onEntryNetworkPortEditingDone          (GtkCellEditable *celleditable,
584                                         gpointer         user_data)
585 {
586
587 }
588
589
590 void
591 onNetworkAddressChanged                (GtkEditable     *editable,
592                                         gpointer         user_data)
593 {
594
595 }
596
597
598 void
599 onEntryNetworkAddressEditingDone       (GtkCellEditable *celleditable,
600                                         gpointer         user_data)
601 {
602
603 }
604
605
606 void
607 onNetworkTypeChanged                   (GtkEditable     *editable,
608                                         gpointer         user_data)
609 {
610
611 }
612
613
614 void
615 onEntryNetworkTypeEditingDone          (GtkCellEditable *celleditable,
616                                         gpointer         user_data)
617 {
618
619 }
620
621
622 void
623 onProtocolTypeChanged                  (GtkEditable     *editable,
624                                         gpointer         user_data)
625 {
626
627 }
628
629
630 void
631 onEntryProtocolTypeEditingDone         (GtkCellEditable *celleditable,
632                                         gpointer         user_data)
633 {
634
635 }
636
637
638 void
639 onMRLTypeChanged                       (GtkEditable     *editable,
640                                         gpointer         user_data)
641 {
642
643 }
644
645
646 void
647 onEntryMRLTypeEditingDone              (GtkCellEditable *celleditable,
648                                         gpointer         user_data)
649 {
650
651 }
652
653
654 void
655 onStreamTypeChanged                    (GtkEditable     *editable,
656                                         gpointer         user_data)
657 {
658
659 }
660
661
662 void
663 onEntryStreamTypeEditingDone           (GtkCellEditable *celleditable,
664                                         gpointer         user_data)
665 {
666
667 }
668
669
670 void
671 onAddNetworkPlaylist                   (GtkButton       *button,
672                                         gpointer         user_data)
673 {
674
675 }
676
677
678 void
679 onV4LAudioChanged                      (GtkEditable     *editable,
680                                         gpointer         user_data)
681 {
682
683 }
684
685
686 void
687 onEntryV4LAudioEditingDone             (GtkCellEditable *celleditable,
688                                         gpointer         user_data)
689 {
690
691 }
692
693
694 void
695 onV4LVideoChanged                      (GtkEditable     *editable,
696                                         gpointer         user_data)
697 {
698
699 }
700
701
702 void
703 onEntryV4LVideoEditingDone             (GtkCellEditable *celleditable,
704                                         gpointer         user_data)
705 {
706
707 }
708
709
710 void
711 onAddCameraToPlaylist                  (GtkButton       *button,
712                                         gpointer         user_data)
713 {
714
715 }
716
717
718 void
719 onVideoDeviceChanged                   (GtkEditable     *editable,
720                                         gpointer         user_data)
721 {
722
723 }
724
725
726 void
727 onEntryVideoDeviceEditingDone          (GtkCellEditable *celleditable,
728                                         gpointer         user_data)
729 {
730
731 }
732
733
734 void
735 onVideoCodecChanged                    (GtkEditable     *editable,
736                                         gpointer         user_data)
737 {
738
739 }
740
741
742 void
743 onEntryVideoCodecEditingDone           (GtkCellEditable *celleditable,
744                                         gpointer         user_data)
745 {
746
747 }
748
749
750 void
751 onVideoBitrateChanged                  (GtkEditable     *editable,
752                                         gpointer         user_data)
753 {
754
755 }
756
757
758 void
759 onVideoBitrateEditingDone              (GtkCellEditable *celleditable,
760                                         gpointer         user_data)
761 {
762
763 }
764
765
766 void
767 onAudioDeviceChanged                   (GtkEditable     *editable,
768                                         gpointer         user_data)
769 {
770
771 }
772
773
774 void
775 onEntryAudioDeviceEditingDone          (GtkCellEditable *celleditable,
776                                         gpointer         user_data)
777 {
778
779 }
780
781
782 void
783 onAudioCodecChanged                    (GtkEditable     *editable,
784                                         gpointer         user_data)
785 {
786
787 }
788
789
790 void
791 onEntryAudioCodecEditingDone           (GtkCellEditable *celleditable,
792                                         gpointer         user_data)
793 {
794
795 }
796
797
798 void
799 onAudioBitrateChanged                  (GtkEditable     *editable,
800                                         gpointer         user_data)
801 {
802
803 }
804
805
806 void
807 onAudioBitrateEditingDone              (GtkCellEditable *celleditable,
808                                         gpointer         user_data)
809 {
810
811 }
812
813
814 void
815 onAddServerToPlaylist                  (GtkButton       *button,
816                                         gpointer         user_data)
817 {
818
819 }
820
821
822 gboolean
823 PlaylistEvent                          (GtkWidget       *widget,
824                                         GdkEvent        *event,
825                                         gpointer         user_data)
826 {
827     g_print("onPlaylistEvent\n");
828     return FALSE;
829 }
830
831
832 void
833 onPlaylistColumnsChanged               (GtkTreeView     *treeview,
834                                         gpointer         user_data)
835 {
836     g_print("onPlaylistColumnsChanged\n");
837 }
838
839
840 gboolean
841 onPlaylistRowSelected                  (GtkTreeView     *treeview,
842                                         gboolean         start_editing,
843                                         gpointer         user_data)
844 {
845   g_print("onPlaylistRowSelected\n");
846   return FALSE;
847 }
848
849
850 void
851 onPlaylistRow                          (GtkTreeView     *treeview,
852                                         GtkTreePath     *path,
853                                         GtkTreeViewColumn *column,
854                                         gpointer         user_data)
855 {
856     g_print("onPlaylistRow\n");
857 }
858
859
860 void
861 onUpdatePlaylist                       (GtkButton       *button,
862                                         gpointer         user_data)
863 {
864
865 }
866
867
868 void
869 onDeletePlaylist                       (GtkButton       *button,
870                                         gpointer         user_data)
871 {
872
873 }
874
875
876 void
877 onClearPlaylist                        (GtkButton       *button,
878                                         gpointer         user_data)
879 {
880
881 }
882
883
884 void
885 onPreferenceSave                       (GtkButton       *button,
886                                         gpointer         user_data)
887 {
888
889 }
890
891
892 void
893 onPreferenceApply                      (GtkButton       *button,
894                                         gpointer         user_data)
895 {
896
897 }
898
899
900 void
901 onPreferenceCancel                     (GtkButton       *button,
902                                         gpointer         user_data)
903 {
904
905 }
906