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

📄 ncurses.c

📁 VLC Player Source Code
💻 C
📖 第 1 页 / 共 5 页
字号:
                                    p_playlist->p_local_onelevel->p_input                                  , false );                    p_sys->i_box_type = BOX_PLAYLIST;                    free( psz_uri );                }                else                {                    int i_size_entry = 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, "%s/%s", p_sys->psz_current_dir, p_sys->pp_dir_entries[p_sys->i_box_bidx]->psz_path );                    p_sys->psz_current_dir = strdup( psz_uri );                    ReadDir( p_intf );                    free( psz_uri );                }                break;            default:                b_ret = false;                break;        }        if( b_ret )        {            if( p_sys->i_box_bidx >= p_sys->i_dir_entries ) p_sys->i_box_bidx = p_sys->i_dir_entries - 1;            if( p_sys->i_box_bidx < 0 ) p_sys->i_box_bidx = 0;            ReturnTrue;        }    }    else if( p_sys->i_box_type == BOX_HELP || p_sys->i_box_type == BOX_INFO ||             p_sys->i_box_type == BOX_META || p_sys->i_box_type == BOX_STATS ||             p_sys->i_box_type == BOX_OBJECTS )    {        switch( i_key )        {            case KEY_HOME:                p_sys->i_box_start = 0;                ReturnTrue;#ifdef __FreeBSD__            case KEY_SELECT:#endif            case KEY_END:                p_sys->i_box_start = p_sys->i_box_lines_total - 1;                ReturnTrue;            case KEY_UP:                if( p_sys->i_box_start > 0 ) p_sys->i_box_start--;                ReturnTrue;            case KEY_DOWN:                if( p_sys->i_box_start < p_sys->i_box_lines_total - 1 )                {                    p_sys->i_box_start++;                }                ReturnTrue;            case KEY_PPAGE:                p_sys->i_box_start -= p_sys->i_box_lines;                if( p_sys->i_box_start < 0 ) p_sys->i_box_start = 0;                ReturnTrue;            case KEY_NPAGE:                p_sys->i_box_start += p_sys->i_box_lines;                if( p_sys->i_box_start >= p_sys->i_box_lines_total )                {                    p_sys->i_box_start = p_sys->i_box_lines_total - 1;                }                ReturnTrue;            default:                break;        }    }    else if( p_sys->i_box_type == BOX_NONE )    {        switch( i_key )        {            case KEY_HOME:                p_sys->f_slider = 0;                ManageSlider( p_intf );                ReturnTrue;#ifdef __FreeBSD__            case KEY_SELECT:#endif            case KEY_END:                p_sys->f_slider = 99.9;                ManageSlider( p_intf );                ReturnTrue;            case KEY_UP:                p_sys->f_slider += 5.0;                if( p_sys->f_slider >= 99.0 ) p_sys->f_slider = 99.0;                ManageSlider( p_intf );                ReturnTrue;            case KEY_DOWN:                p_sys->f_slider -= 5.0;                if( p_sys->f_slider < 0.0 ) p_sys->f_slider = 0.0;                ManageSlider( p_intf );                ReturnTrue;            default:                break;        }    }    else if( p_sys->i_box_type == BOX_SEARCH && p_sys->psz_search_chain )    {        int i_chain_len = strlen( p_sys->psz_search_chain );        switch( i_key )        {            case KEY_CLEAR:            case 0x0c:      /* ^l */                clear();                ReturnTrue;            case KEY_ENTER:            case '\r':            case '\n':                if( i_chain_len > 0 )                {                    p_sys->psz_old_search = strdup( p_sys->psz_search_chain );                }                else if( p_sys->psz_old_search )                {                    SearchPlaylist( p_intf, p_sys->psz_old_search );                }                p_sys->i_box_type = BOX_PLAYLIST;                ReturnTrue;            case 0x1b: /* ESC */                /* Alt+key combinations return 2 keys in the terminal keyboard:                 * ESC, and the 2nd key.                 * If some other key is available immediately (where immediately                 * means after wgetch() 1 second delay ), that means that the                 * ESC key was not pressed.                 *                 * man 3X curs_getch says:                 *                 * Use of the escape key by a programmer for a single                 * character function is discouraged, as it will cause a delay                 * of up to one second while the keypad code looks for a                 * following function-key sequence.                 *                 */                if( wgetch( p_sys->w ) != ERR )                    ReturnFalse;                p_sys->i_box_plidx = p_sys->i_before_search;                p_sys->i_box_type = BOX_PLAYLIST;                ReturnTrue;            case KEY_BACKSPACE:            case 0x7f:                RemoveLastUTF8Entity( p_sys->psz_search_chain, i_chain_len );                break;            default:            {#ifdef HAVE_NCURSESW                if( i_chain_len + 1 < SEARCH_CHAIN_SIZE )                {                    p_sys->psz_search_chain[i_chain_len] = (char) i_key;                    p_sys->psz_search_chain[i_chain_len + 1] = '\0';                }#else                char *psz_utf8 = KeyToUTF8( i_key, p_sys->psz_partial_keys );                if( psz_utf8 != NULL )                {                    if( i_chain_len + strlen( psz_utf8 ) < SEARCH_CHAIN_SIZE )                    {                        strcpy( p_sys->psz_search_chain + i_chain_len,                                psz_utf8 );                    }                    free( psz_utf8 );                }#endif                break;            }        }        free( p_sys->psz_old_search );        p_sys->psz_old_search = NULL;        SearchPlaylist( p_intf, p_sys->psz_search_chain );        ReturnTrue;    }    else if( p_sys->i_box_type == BOX_OPEN && p_sys->psz_open_chain )    {        int i_chain_len = strlen( p_sys->psz_open_chain );        switch( i_key )        {            case KEY_CLEAR:            case 0x0c:          /* ^l */                clear();                ReturnTrue;            case KEY_ENTER:            case '\r':            case '\n':                if( i_chain_len > 0 )                {                    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, p_sys->psz_open_chain, NULL,                                  PLAYLIST_APPEND|PLAYLIST_GO, PLAYLIST_END,                                  p_parent->p_input ==                                    p_playlist->p_local_onelevel->p_input                                  , false );                    p_sys->b_box_plidx_follow = true;                }                p_sys->i_box_type = BOX_PLAYLIST;                ReturnTrue;            case 0x1b:  /* ESC */                if( wgetch( p_sys->w ) != ERR )                    ReturnFalse;                p_sys->i_box_type = BOX_PLAYLIST;                ReturnTrue;            case KEY_BACKSPACE:            case 0x7f:                RemoveLastUTF8Entity( p_sys->psz_open_chain, i_chain_len );                break;            default:            {#ifdef HAVE_NCURSESW                if( i_chain_len + 1 < OPEN_CHAIN_SIZE )                {                    p_sys->psz_open_chain[i_chain_len] = (char) i_key;                    p_sys->psz_open_chain[i_chain_len + 1] = '\0';                }#else                char *psz_utf8 = KeyToUTF8( i_key, p_sys->psz_partial_keys );                if( psz_utf8 != NULL )                {                    if( i_chain_len + strlen( psz_utf8 ) < OPEN_CHAIN_SIZE )                    {                        strcpy( p_sys->psz_open_chain + i_chain_len,                                psz_utf8 );                    }                    free( psz_utf8 );                }#endif                break;            }        }        ReturnTrue;    }    /* Common keys */    switch( i_key )    {        case 0x1b:  /* ESC */            if( wgetch( p_sys->w ) != ERR )                ReturnFalse;        case 'q':        case 'Q':        case KEY_EXIT:            vlc_object_kill( p_intf->p_libvlc );            ReturnFalse;        /* Box switching */        case 'i':            if( p_sys->i_box_type == BOX_INFO )                p_sys->i_box_type = BOX_NONE;            else                p_sys->i_box_type = BOX_INFO;            p_sys->i_box_lines_total = 0;            ReturnTrue;        case 'm':            if( p_sys->i_box_type == BOX_META )                p_sys->i_box_type = BOX_NONE;            else                p_sys->i_box_type = BOX_META;            p_sys->i_box_lines_total = 0;            ReturnTrue;        case 'L':            if( p_sys->i_box_type == BOX_LOG )                p_sys->i_box_type = BOX_NONE;            else                p_sys->i_box_type = BOX_LOG;            ReturnTrue;        case 'P':            if( p_sys->i_box_type == BOX_PLAYLIST )                p_sys->i_box_type = BOX_NONE;            else                p_sys->i_box_type = BOX_PLAYLIST;            ReturnTrue;        case 'B':            if( p_sys->i_box_type == BOX_BROWSE )                p_sys->i_box_type = BOX_NONE;            else                p_sys->i_box_type = BOX_BROWSE;            ReturnTrue;        case 'x':            if( p_sys->i_box_type == BOX_OBJECTS )                p_sys->i_box_type = BOX_NONE;            else                p_sys->i_box_type = BOX_OBJECTS;            ReturnTrue;        case 'S':            if( p_sys->i_box_type == BOX_STATS )                p_sys->i_box_type = BOX_NONE;            else                p_sys->i_box_type = BOX_STATS;            ReturnTrue;        case 'c':            p_sys->b_color = !p_sys->b_color;            if( p_sys->b_color && !p_sys->b_color_started )                start_color_and_pairs( p_intf );            ReturnTrue;        case 'h':        case 'H':            if( p_sys->i_box_type == BOX_HELP )                p_sys->i_box_type = BOX_NONE;            else                p_sys->i_box_type = BOX_HELP;            p_sys->i_box_lines_total = 0;            ReturnTrue;        case '/':            if( p_sys->i_box_type != BOX_SEARCH )            {                if( p_sys->psz_search_chain == NULL )                    ReturnTrue;                p_sys->psz_search_chain[0] = '\0';                p_sys->b_box_plidx_follow = false;                p_sys->i_before_search = p_sys->i_box_plidx;                p_sys->i_box_type = BOX_SEARCH;            }            ReturnTrue;        case 'A': /* Open */            if( p_sys->i_box_type != BOX_OPEN )            {                if( p_sys->psz_open_chain == NULL )                    ReturnTrue;                p_sys->psz_open_chain[0] = '\0';                p_sys->i_box_type = BOX_OPEN;            }            ReturnTrue;        /* Navigation */        case KEY_RIGHT:            p_sys->f_slider += 1.0;            if( p_sys->f_slider > 99.9 ) p_sys->f_slider = 99.9;            ManageSlider( p_intf );            ReturnTrue;        case KEY_LEFT:            p_sys->f_slider -= 1.0;            if( p_sys->f_slider < 0.0 ) p_sys->f_slider = 0.0;            ManageSlider( p_intf );            ReturnTrue;        /* Common control */        case 'f':        {            if( p_intf->p_sys->p_input )            {                vout_thread_t *p_vout;                p_vout = vlc_object_find( p_intf->p_sys->p_input,                                          VLC_OBJECT_VOUT, FIND_CHILD );                if( p_vout )                {                    var_Get( p_vout, "fullscreen", &val );                    val.b_bool = !val.b_bool;                    var_Set( p_vout, "fullscreen", val );                    vlc_object_release( p_vout );                }                else                {                    var_Get( p_playlist, "fullscreen", &val );                    val.b_bool = !val.b_bool;                    var_Set( p_playlist, "fullscreen", val );                }            }            ReturnFalse;        }        case ' ':            PlayPause( p_intf );            ReturnTrue;        case 's':            playlist_Stop( p_playlist );            ReturnTrue;        case 'e':            Eject( p_intf );            ReturnTrue;        case '[':            if( p_sys->p_input )            {                val.b_bool = true;                var_Set( p_sys->p_input, "prev-title", val );            }            ReturnTrue;        case ']':            if( p_sys->p_input )            {                val.b_bool = true;                var_Set( p_sys->p_input, "next-title", val );            }            ReturnTrue;

⌨️ 快捷键说明

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