⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ncurses.c

📁 VLC Player Source Code
💻 C
📖 第 1 页 / 共 5 页
字号:
    var_AddCallback( p_playlist, "item-append", PlaylistChanged, p_intf );    var_AddCallback( p_playlist, "item-change", PlaylistChanged, p_intf );    while( !intf_ShouldDie( p_intf ) )    {        msleep( INTF_IDLE_SLEEP );        /* Update the input */        PL_LOCK;        if( p_sys->p_input == NULL )        {            p_sys->p_input = p_playlist->p_input;            if( p_sys->p_input )            {                if( !p_sys->p_input->b_dead )                {                    vlc_object_yield( p_sys->p_input );                }            }        }        else if( p_sys->p_input->b_dead )        {            vlc_object_release( p_sys->p_input );            p_sys->p_input = NULL;            p_sys->f_slider = p_sys->f_slider_old = 0.0;            p_sys->b_box_cleared = false;        }        PL_UNLOCK;        if( p_sys->b_box_plidx_follow && p_playlist->status.p_item )        {            FindIndex( p_intf );        }        while( ( i_key = wgetch( p_sys->w ) ) != -1 )        {            /*             * HandleKey returns 1 if the screen needs to be redrawn             */            if( HandleKey( p_intf, i_key ) )            {                Redraw( p_intf, &t_last_refresh );            }        }        /* Hack */        if( p_sys->f_slider > 0.0001 && !p_sys->b_box_cleared )        {            clear();            Redraw( p_intf, &t_last_refresh );            p_sys->b_box_cleared = true;        }        /*         * redraw the screen every second         */        if( (time(0) - t_last_refresh) >= 1 )        {            ManageSlider( p_intf );            Redraw( p_intf, &t_last_refresh );        }    }    var_DelCallback( p_playlist, "intf-change", PlaylistChanged, p_intf );    var_DelCallback( p_playlist, "item-append", PlaylistChanged, p_intf );    var_DelCallback( p_playlist, "item-change", PlaylistChanged, p_intf );}/* following functions are local */static void start_color_and_pairs( intf_thread_t *p_intf ){    assert( p_intf->p_sys->b_color && !p_intf->p_sys->b_color_started );    if( !has_colors() )    {        p_intf->p_sys->b_color = false;        msg_Warn( p_intf, "Terminal doesn't support colors" );        return;    }    start_color();    /* Available colors: BLACK RED GREEN YELLOW BLUE MAGENTA CYAN WHITE */    /* untested, in all my terminals, !can_change_color() --funman */    if( can_change_color() )        init_color( COLOR_YELLOW, 960, 500, 0 ); /* YELLOW -> ORANGE */    /* title */    init_pair( C_TITLE, COLOR_YELLOW, COLOR_BLACK );    /* jamaican playlist */    init_pair( C_PLAYLIST_1, COLOR_GREEN, COLOR_BLACK );    init_pair( C_PLAYLIST_2, COLOR_YELLOW, COLOR_BLACK );    init_pair( C_PLAYLIST_3, COLOR_RED, COLOR_BLACK );    /* used in DrawBox() */    init_pair( C_BOX, COLOR_CYAN, COLOR_BLACK );    /* Source, State, Position, Volume, Chapters, etc...*/    init_pair( C_STATUS, COLOR_BLUE, COLOR_BLACK );    /* VLC messages, keep the order from highest priority to lowest */    /* infos */    init_pair( C_INFO, COLOR_BLACK, COLOR_WHITE );    /* errors */    init_pair( C_ERROR, COLOR_RED, COLOR_BLACK );    /* warnings */    init_pair( C_WARNING, COLOR_YELLOW, COLOR_BLACK );/* debug */    init_pair( C_DEBUG, COLOR_WHITE, COLOR_BLACK );    /* Category title (help, info, metadata) */    init_pair( C_CATEGORY, COLOR_MAGENTA, COLOR_BLACK );    /* Folder (BOX_BROWSE) */    init_pair( C_FOLDER, COLOR_RED, COLOR_BLACK );    p_intf->p_sys->b_color_started = true;}#ifndef HAVE_NCURSESWstatic char *KeyToUTF8( int i_key, char *psz_part ){    char *psz_utf8;    int len = strlen( psz_part );    if( len == 6 )    {        /* overflow error - should not happen */        memset( psz_part, 0, 6 );        return NULL;    }    psz_part[len] = (char)i_key;    psz_utf8 = FromLocaleDup( psz_part );    /* Ugly check for incomplete bytes sequences     * (in case of non-UTF8 multibyte local encoding) */    char *psz;    for( psz = psz_utf8; *psz; psz++ )        if( ( *psz == '?' ) && ( *psz_utf8 != '?' ) )        {            /* incomplete bytes sequence detected             * (VLC core inserted dummy question marks) */            free( psz_utf8 );            return NULL;        }    /* Check for incomplete UTF8 bytes sequence */    if( EnsureUTF8( psz_utf8 ) == NULL )    {        free( psz_utf8 );        return NULL;    }    memset( psz_part, 0, 6 );    return psz_utf8;}#endifstatic inline int RemoveLastUTF8Entity( char *psz, int len ){    while( len && ( (psz[--len] & 0xc0) == 0x80 ) );                       /* UTF8 continuation byte */    psz[len] = '\0';    return len;}static int HandleKey( intf_thread_t *p_intf, int i_key ){    intf_sys_t *p_sys = p_intf->p_sys;    vlc_value_t val;    #define ReturnTrue \    do { \    vlc_object_release( p_playlist ); \    return 1; \    } while(0)    #define ReturnFalse \    do { \    vlc_object_release( p_playlist ); \    return 0; \    } while(0)    playlist_t *p_playlist = pl_Yield( p_intf );    if( p_sys->i_box_type == BOX_PLAYLIST )    {        int b_ret = true;        bool b_box_plidx_follow = false;        switch( i_key )        {            vlc_value_t val;            /* Playlist Settings */            case 'r':                var_Get( p_playlist, "random", &val );                val.b_bool = !val.b_bool;                var_Set( p_playlist, "random", val );                ReturnTrue;            case 'l':                var_Get( p_playlist, "loop", &val );                val.b_bool = !val.b_bool;                var_Set( p_playlist, "loop", val );                ReturnTrue;            case 'R':                var_Get( p_playlist, "repeat", &val );                val.b_bool = !val.b_bool;                var_Set( p_playlist, "repeat", val );                ReturnTrue;            /* Playlist sort */            case 'o':                playlist_RecursiveNodeSort( p_playlist,                                            PlaylistGetRoot( p_intf ),                                            SORT_TITLE_NODES_FIRST, ORDER_NORMAL );                p_sys->b_need_update = true;                ReturnTrue;            case 'O':                playlist_RecursiveNodeSort( p_playlist,                                            PlaylistGetRoot( p_intf ),                                            SORT_TITLE_NODES_FIRST, ORDER_REVERSE );                p_sys->b_need_update = true;                ReturnTrue;            /* Playlist view */            case 'v':                switch( p_sys->i_current_view )                {                    case VIEW_CATEGORY:                        p_sys->i_current_view = VIEW_ONELEVEL;                        break;                    default:                        p_sys->i_current_view = VIEW_CATEGORY;                }                //p_sys->b_need_update = true;                PlaylistRebuild( p_intf );                ReturnTrue;            /* Playlist navigation */            case 'g':                FindIndex( p_intf );                break;            case KEY_HOME:                p_sys->i_box_plidx = 0;                break;#ifdef __FreeBSD__/* workaround for FreeBSD + xterm: * see http://www.nabble.com/curses-vs.-xterm-key-mismatch-t3574377.html */            case KEY_SELECT:#endif            case KEY_END:                p_sys->i_box_plidx = p_playlist->items.i_size - 1;                break;            case KEY_UP:                p_sys->i_box_plidx--;                break;            case KEY_DOWN:                p_sys->i_box_plidx++;                break;            case KEY_PPAGE:                p_sys->i_box_plidx -= p_sys->i_box_lines;                break;            case KEY_NPAGE:                p_sys->i_box_plidx += p_sys->i_box_lines;                break;            case 'D':            case KEY_BACKSPACE:            case 0x7f:            case KEY_DC:            {                playlist_item_t *p_item;                PL_LOCK;                p_item = p_sys->pp_plist[p_sys->i_box_plidx]->p_item;                if( p_item->i_children == -1 )                {                    playlist_DeleteFromInput( p_playlist,                                              p_item->p_input->i_id, pl_Locked );                }                else                {                    playlist_NodeDelete( p_playlist, p_item,                                         true , false );                }                PL_UNLOCK;                PlaylistRebuild( p_intf );                break;            }            case KEY_ENTER:            case '\r':            case '\n':                if( !p_sys->pp_plist[p_sys->i_box_plidx] )                {                    b_ret = false;                    break;                }                if( p_sys->pp_plist[p_sys->i_box_plidx]->p_item->i_children                        == -1 )                {                    playlist_item_t *p_item, *p_parent;                    p_item = p_parent =                            p_sys->pp_plist[p_sys->i_box_plidx]->p_item;                    if( !p_parent )                        p_parent = p_playlist->p_root_onelevel;                    while( p_parent->p_parent )                        p_parent = p_parent->p_parent;                    playlist_Control( p_playlist, PLAYLIST_VIEWPLAY,                                      pl_Unlocked, p_parent, p_item );                }                else if( p_sys->pp_plist[p_sys->i_box_plidx]->p_item->i_children                        == 0 )                {   /* We only want to set the current node */                    playlist_Stop( p_playlist );                    p_sys->p_node = p_sys->pp_plist[p_sys->i_box_plidx]->p_item;                }                else                {                    p_sys->p_node = p_sys->pp_plist[p_sys->i_box_plidx]->p_item;                    playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, pl_Unlocked,                        p_sys->pp_plist[p_sys->i_box_plidx]->p_item, NULL );                }                b_box_plidx_follow = true;                break;            default:                b_ret = false;                break;        }        if( b_ret )        {            int i_max = p_sys->i_plist_entries;            if( p_sys->i_box_plidx >= i_max ) p_sys->i_box_plidx = i_max - 1;            if( p_sys->i_box_plidx < 0 ) p_sys->i_box_plidx = 0;            if( PlaylistIsPlaying( p_intf,                    p_sys->pp_plist[p_sys->i_box_plidx]->p_item ) )                b_box_plidx_follow = true;            p_sys->b_box_plidx_follow = b_box_plidx_follow;            ReturnTrue;        }    }    if( p_sys->i_box_type == BOX_BROWSE )    {        bool b_ret = true;        /* Browser navigation */        switch( i_key )        {            case KEY_HOME:                p_sys->i_box_bidx = 0;                break;#ifdef __FreeBSD__            case KEY_SELECT:#endif            case KEY_END:                p_sys->i_box_bidx = p_sys->i_dir_entries - 1;                break;            case KEY_UP:                p_sys->i_box_bidx--;                break;            case KEY_DOWN:                p_sys->i_box_bidx++;                break;            case KEY_PPAGE:                p_sys->i_box_bidx -= p_sys->i_box_lines;                break;            case KEY_NPAGE:                p_sys->i_box_bidx += p_sys->i_box_lines;                break;            case '.': /* Toggle show hidden files */                p_sys->b_show_hidden_files = ( p_sys->b_show_hidden_files ==                    true ? false : true );                ReadDir( p_intf );                break;            case KEY_ENTER:            case '\r':            case '\n':            case ' ':                if( p_sys->pp_dir_entries[p_sys->i_box_bidx]->b_file || i_key == ' ' )                {                    int i_size_entry = strlen( "directory://" ) +                                       strlen( p_sys->psz_current_dir ) +                                       strlen( p_sys->pp_dir_entries[p_sys->i_box_bidx]->psz_path ) + 2;                    char *psz_uri = (char *)malloc( sizeof(char)*i_size_entry);                    sprintf( psz_uri, "directory://%s/%s", p_sys->psz_current_dir, p_sys->pp_dir_entries[p_sys->i_box_bidx]->psz_path );                    playlist_item_t *p_parent = p_sys->p_node;                    if( !p_parent )                    p_parent = p_playlist->status.p_node;                    if( !p_parent )                        p_parent = p_playlist->p_local_onelevel;                    while( p_parent->p_parent && p_parent->p_parent->p_parent )                        p_parent = p_parent->p_parent;                    playlist_Add( p_playlist, psz_uri, NULL, PLAYLIST_APPEND,                                  PLAYLIST_END,                                  p_parent->p_input ==

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -