maemo_interface.c
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:6k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2. * maemo_interface.c : Interface creation of the maemo plugin
  3. *****************************************************************************
  4. * Copyright (C) 2008 the VideoLAN team
  5. * $Id: 16cf8f0927a89c57df1d7426223dba7dd7625b97 $
  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. #include <vlc_common.h>
  24. #include <gtk/gtk.h>
  25. #include "maemo.h"
  26. #include "maemo_callbacks.h"
  27. #include "maemo_interface.h"
  28. static void scan_maemo_for_media ( intf_thread_t *p_intf );
  29. static void find_media_in_dir    ( const char *psz_dir, GList **pp_list );
  30. static const char *ppsz_extensions[] =
  31.     { "aac", "flac", "m4a", "m4p", "mka", "mp1", "mp2", "mp3",
  32.       "ogg", "wav", "wma", "asf", "avi", "divx", "flv", "m1v",
  33.       "m2v", "m4v", "mkv", "mov", "mpeg", "mpeg1", "mpeg2", "mpeg4",
  34.       "mpg", "ogm", "wmv", NULL };
  35. static const char *ppsz_media_dirs[] =
  36.     { "/media/mmc1", "/media/mmc2", "/home/user/MyDocs/.videos", NULL };
  37. #define ADD_MENU_ITEM( label, callback ) 
  38.     item = gtk_menu_item_new_with_label( label ); 
  39.     gtk_menu_append( main_menu, item ); 
  40.     g_signal_connect( GTK_OBJECT( item ), "activate", G_CALLBACK( callback ), 
  41.                       p_intf );
  42. #define ADD_CHECK_MENU_ITEM( label, callback ) 
  43.     item = gtk_check_menu_item_new_with_label( label ); 
  44.     gtk_menu_append( main_menu, item ); 
  45.     g_signal_connect( GTK_OBJECT( item ), "toggled", G_CALLBACK( callback ), 
  46.                       p_intf );
  47. #define ADD_SEPARATOR 
  48.     item = gtk_separator_menu_item_new(); 
  49.     gtk_menu_append( main_menu, item );
  50. void create_menu( intf_thread_t *p_intf )
  51. {
  52.     /* Needed variables */
  53.     GtkWidget *main_menu;
  54.     GtkWidget *item;
  55.     int i_skip;
  56.     /* Creating the main menu */
  57.     main_menu = gtk_menu_new();
  58.     /* Getting ffmpeg-skip-frame value */
  59.     i_skip = config_GetInt( p_intf, "ffmpeg-skip-frame" );
  60.     /* Filling the menu */
  61.     ADD_MENU_ITEM( "Open", open_cb );
  62.     ADD_MENU_ITEM( "Open Address", open_address_cb );
  63.     ADD_MENU_ITEM( "Open Webcam", open_webcam_cb );
  64.     ADD_SEPARATOR;
  65.     ADD_MENU_ITEM( "Take a snapshot", snapshot_cb );
  66.     ADD_CHECK_MENU_ITEM( "Drop frames", dropframe_cb );
  67.     if( i_skip )
  68.         gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( item ), true );
  69.     ADD_SEPARATOR;
  70.     ADD_MENU_ITEM( "Close", delete_event_cb );
  71.     hildon_window_set_menu( HILDON_WINDOW( p_intf->p_sys->p_main_window ),
  72.                             GTK_MENU( main_menu ) );
  73.     gtk_widget_show_all( main_menu );
  74. }
  75. #undef ADD_MENU
  76. #undef ADD_CHECK_MENU_ITEM
  77. #undef ADD_SEPARATOR
  78. void create_playlist( intf_thread_t *p_intf )
  79. {
  80.     GtkWidget *playlist;
  81.     GtkWidget *scroll;
  82.     GtkListStore *playlist_store;
  83.     GtkTreeViewColumn *col;
  84.     GtkCellRenderer *renderer;
  85.     playlist = gtk_tree_view_new();
  86.     playlist_store = gtk_list_store_new( 1, G_TYPE_STRING );
  87.     p_intf->p_sys->p_playlist_store = GTK_WIDGET( playlist_store );
  88.     gtk_tree_view_set_model( GTK_TREE_VIEW( playlist ),
  89.                              GTK_TREE_MODEL( playlist_store ) );
  90.     renderer = gtk_cell_renderer_text_new();
  91.     col = gtk_tree_view_column_new_with_attributes( "File", renderer,
  92.                                                     "text", 0, NULL );
  93.     gtk_tree_view_append_column( GTK_TREE_VIEW( playlist ), col );
  94.     g_object_set( playlist, "headers-visible", TRUE, NULL );
  95.     scan_maemo_for_media( p_intf );
  96.     scroll = gtk_scrolled_window_new( NULL, NULL );
  97.     gtk_container_add( GTK_CONTAINER( scroll ), playlist );
  98.     gtk_notebook_append_page( GTK_NOTEBOOK( p_intf->p_sys->p_tabs ), scroll,
  99.                               gtk_image_new_from_stock( "vlc-playlist",
  100.                                                         GTK_ICON_SIZE_DIALOG ) );
  101.     gtk_notebook_set_tab_label_packing( GTK_NOTEBOOK( p_intf->p_sys->p_tabs ), scroll,
  102.                                         FALSE, FALSE, GTK_PACK_START );
  103.     g_signal_connect( playlist, "row-activated",
  104.                       G_CALLBACK( pl_row_activated_cb ), NULL );
  105. }
  106. static void scan_maemo_for_media( intf_thread_t *p_intf )
  107. {
  108.     GtkListStore *playlist_store = GTK_LIST_STORE( p_intf->p_sys->p_playlist_store );
  109.     GList *list = NULL;
  110.     GtkTreeIter iter;
  111.     for( int i = 0; ppsz_media_dirs[i]; i++ )
  112.     {
  113.         find_media_in_dir( ppsz_media_dirs[i], &list );
  114.         msg_Dbg( p_intf, "Looking for media in %s", ppsz_media_dirs[i] );
  115.     }
  116.     list = g_list_first( list );
  117.     while( list )
  118.     {
  119.         msg_Dbg( p_intf, "Adding : %s", (char *)list->data );
  120.         gtk_list_store_append( playlist_store, &iter );
  121.         gtk_list_store_set( playlist_store, &iter,
  122.                             0, list->data, -1 );
  123.         list = g_list_next( list );
  124.     }
  125. }
  126. static void find_media_in_dir( const char *psz_dir, GList **pp_list )
  127. {
  128.     GDir *dir = NULL;
  129.     const gchar *psz_name;
  130.     char *psz_path;
  131.     dir = g_dir_open( psz_dir, 0, NULL );
  132.     if( !dir )
  133.         return;
  134.     while( ( psz_name = g_dir_read_name( dir ) ) != NULL )
  135.     {
  136.         psz_path = g_build_path( "/", psz_dir, psz_name, NULL );
  137.         if( g_file_test( psz_path, G_FILE_TEST_IS_DIR ) &&
  138.             !g_file_test( psz_path, G_FILE_TEST_IS_SYMLINK ) )
  139.             find_media_in_dir( psz_path, pp_list );
  140.         else
  141.         {
  142.             char *psz_ext = strrchr( psz_name, '.' );
  143.             if( psz_ext )
  144.             {
  145.                 psz_ext++;
  146.                 for( int i = 0; ppsz_extensions[i]; i++ )
  147.                 {
  148.                     if( strcmp( psz_ext, ppsz_extensions[i] ) == 0 )
  149.                     {
  150.                         *pp_list = g_list_append( *pp_list, g_strdup( psz_path ) );
  151.                         break;
  152.                     }
  153.                 }
  154.             }
  155.         }
  156.         g_free( psz_path );
  157.     }
  158.     g_dir_close( dir );
  159.     return;
  160. }