ncurses.c

来自「VLC媒体播放程序」· C语言 代码 · 共 1,156 行 · 第 1/3 页

C
1,156
字号
            case KEY_HOME:                p_sys->f_slider = 0;                ManageSlider ( p_intf );                return 1;            case KEY_END:                p_sys->f_slider = 99.9;                ManageSlider ( p_intf );                return 1;            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 );                return 1;            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 );                return 1;            default:                break;        }    }    /* Common keys */    switch( i_key )    {        case 'q':        case 'Q':        case 0x1b:  /* Esc */            p_intf->b_die = 1;            return 0;        /* 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;            return 1;        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;            return 1;        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;            return 1;        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;            return 1;        /* 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 );            return 1;        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 );            return 1;        /* Common control */        case 'f':        {            vout_thread_t *p_vout;            if( p_intf->p_sys->p_input )            {                p_vout = vlc_object_find( p_intf->p_sys->p_input,                                          VLC_OBJECT_VOUT, FIND_CHILD );                if( p_vout )                {                    p_vout->i_changes |= VOUT_FULLSCREEN_CHANGE;                    vlc_object_release( p_vout );                }            }            return 0;        }        case ' ':            PlayPause( p_intf );            return 1;        case 's':            if( p_intf->p_sys->p_playlist )            {                playlist_Stop( p_intf->p_sys->p_playlist );            }            return 1;        case 'e':            Eject( p_intf );            return 1;        case '[':            if( p_sys->p_input )            {                val.b_bool = VLC_TRUE;                var_Set( p_sys->p_input, "prev-title", val );            }            return 1;        case ']':            if( p_sys->p_input )            {                val.b_bool = VLC_TRUE;                var_Set( p_sys->p_input, "next-title", val );            }            return 1;        case '<':            if( p_sys->p_input )            {                val.b_bool = VLC_TRUE;                var_Set( p_sys->p_input, "prev-chapter", val );            }            return 1;        case '>':            if( p_sys->p_input )            {                val.b_bool = VLC_TRUE;                var_Set( p_sys->p_input, "next-chapter", val );            }            return 1;        case 'p':            if( p_intf->p_sys->p_playlist )            {                playlist_Prev( p_intf->p_sys->p_playlist );            }            clear();            return 1;        case 'n':            if( p_intf->p_sys->p_playlist )            {                playlist_Next( p_intf->p_sys->p_playlist );            }            clear();            return 1;        /*         * ^l should clear and redraw the screen         */        case 0x0c:            clear();            return 1;        default:            return 0;    }}static void ManageSlider ( intf_thread_t *p_intf ){    intf_sys_t     *p_sys = p_intf->p_sys;    input_thread_t *p_input = p_sys->p_input;    vlc_value_t     val;    if( p_input == NULL )    {        return;    }    var_Get( p_input, "state", &val );    if( val.i_int != PLAYING_S )    {        return;    }    var_Get( p_input, "position", &val );    if( p_sys->f_slider == p_sys->f_slider_old )    {        p_sys->f_slider =        p_sys->f_slider_old = 100 * val.f_float;    }    else    {        p_sys->f_slider_old = p_sys->f_slider;        val.f_float = p_sys->f_slider / 100.0;        var_Set( p_input, "position", val );    }}static void mvnprintw( int y, int x, int w, const char *p_fmt, ... ){    va_list  vl_args;    char    *p_buf = NULL;    int      i_len;    va_start ( vl_args, p_fmt );    vasprintf ( &p_buf, p_fmt, vl_args );    va_end ( vl_args );    if ( p_buf == NULL )    {        return;    }    if(  w > 0 )    {        if( ( i_len = strlen( p_buf ) ) > w )        {            int i_cut = i_len - w;            int x1 = i_len/2 - i_cut/2;            int x2 = x1 + i_cut;            if( i_len > x2 )            {                memmove( &p_buf[x1], &p_buf[x2], i_len - x2 );            }            p_buf[w] = '\0';            if( w > 7 )            {                p_buf[w/2-1] = '.';                p_buf[w/2  ] = '.';                p_buf[w/2+1] = '.';            }            mvprintw( y, x, "%s", p_buf );        }        else        {            mvprintw( y, x, "%s", p_buf );            mvhline( y, x + i_len, ' ', w - i_len );        }    }}static void MainBoxWrite( intf_thread_t *p_intf, int l, int x, const char *p_fmt, ... ){    intf_sys_t     *p_sys = p_intf->p_sys;    va_list  vl_args;    char    *p_buf = NULL;    if( l < p_sys->i_box_start || l - p_sys->i_box_start >= p_sys->i_box_lines )    {        return;    }    va_start ( vl_args, p_fmt );    vasprintf ( &p_buf, p_fmt, vl_args );    va_end ( vl_args );    if( p_buf == NULL )    {        return;    }    mvnprintw( p_sys->i_box_y + l - p_sys->i_box_start, x, COLS - x - 1, "%s", p_buf );}static void Redraw ( intf_thread_t *p_intf, time_t *t_last_refresh ){    intf_sys_t     *p_sys = p_intf->p_sys;    input_thread_t *p_input = p_sys->p_input;    int y = 0;    int h;    int y_end;    //clear();    /* Title */    attrset ( A_REVERSE );    mvnprintw( y, 0, COLS, VOUT_TITLE " (ncurses interface) [ h for help ]" );    attroff ( A_REVERSE );    y += 2;    /* Infos */    if( p_input && !p_input->b_dead )    {        char buf1[MSTRTIME_MAX_SIZE];        char buf2[MSTRTIME_MAX_SIZE];        vlc_value_t val;        vlc_value_t val_list;        /* Source */        mvnprintw( y++, 0, COLS, " Source   : %s", p_input->psz_source );        /* State */        var_Get( p_input, "state", &val );        if( val.i_int == PLAYING_S )        {            mvnprintw( y++, 0, COLS, " State    : Playing" );        }        else if( val.i_int == PAUSE_S )        {            mvnprintw( y++, 0, COLS, " State    : Paused" );        }        else        {            y++;        }        if( val.i_int != INIT_S && val.i_int != END_S )        {            /* Position */            var_Get( p_input, "time", &val );            msecstotimestr( buf1, val.i_time / 1000 );            var_Get( p_input, "length", &val );            msecstotimestr( buf2, val.i_time / 1000 );            mvnprintw( y++, 0, COLS, " Position : %s/%s (%.2f%%)", buf1, buf2, p_sys->f_slider );            /* Title */            if( !var_Get( p_input, "title", &val ) )            {                var_Change( p_input, "title", VLC_VAR_GETCHOICES, &val_list, NULL );                if( val_list.p_list->i_count > 0 )                {                    mvnprintw( y++, 0, COLS, " Title    : %d/%d", val.i_int, val_list.p_list->i_count );                }                var_Change( p_input, "title", VLC_VAR_FREELIST, &val_list, NULL );            }            /* Chapter */            if( !var_Get( p_input, "chapter", &val ) )            {                var_Change( p_input, "chapter", VLC_VAR_GETCHOICES, &val_list, NULL );                if( val_list.p_list->i_count > 0 )                {                    mvnprintw( y++, 0, COLS, " Chapter  : %d/%d", val.i_int, val_list.p_list->i_count );                }                var_Change( p_input, "chapter", VLC_VAR_FREELIST, &val_list, NULL );            }        }        else        {            y++;        }    }    else    {        mvnprintw( y++, 0, COLS, "Source: <no current item>" );        DrawEmptyLine( p_sys->w, y++, 0, COLS );        DrawEmptyLine( p_sys->w, y++, 0, COLS );    }    DrawBox( p_sys->w, y, 0, 3, COLS, "" );    DrawEmptyLine( p_sys->w, y+1, 1, COLS-2);    DrawLine( p_sys->w, y+1, 1, (int)(p_intf->p_sys->f_slider/100.0 * (COLS -2)) );    y += 3;    p_sys->i_box_y = y + 1;    p_sys->i_box_lines = LINES - y - 2;    h = LINES - y;    y_end = y + h - 1;    if( p_sys->i_box_type == BOX_HELP )    {        /* Help box */        int l = 0;        DrawBox( p_sys->w, y++, 0, h, COLS, " Help " );        MainBoxWrite( p_intf, l++, 1, "[Display]" );        MainBoxWrite( p_intf, l++, 1, "     h,H         Show/Hide help box" );        MainBoxWrite( p_intf, l++, 1, "     i           Show/Hide informations box" );        MainBoxWrite( p_intf, l++, 1, "     l           Show/Hide logs box" );        MainBoxWrite( p_intf, l++, 1, "     P           Show/Hide playlist box" );        MainBoxWrite( p_intf, l++, 1, "" );        MainBoxWrite( p_intf, l++, 1, "[Global]" );        MainBoxWrite( p_intf, l++, 1, "     q, Q        Quit" );        MainBoxWrite( p_intf, l++, 1, "     s           Stop" );        MainBoxWrite( p_intf, l++, 1, "   <space>       Pause/Play" );        MainBoxWrite( p_intf, l++, 1, "     n, p        Next/Previous item" );        MainBoxWrite( p_intf, l++, 1, "     [, ]        Next/Previous title" );        MainBoxWrite( p_intf, l++, 1, "     <, >        Next/Previous title" );        MainBoxWrite( p_intf, l++, 1, "     <right>     Seek +1%%" );        MainBoxWrite( p_intf, l++, 1, "     <left>      Seek -1%%" );        MainBoxWrite( p_intf, l++, 1, "" );        MainBoxWrite( p_intf, l++, 1, "[Playlist]" );        MainBoxWrite( p_intf, l++, 1, "     r           Randomize playlist" );

⌨️ 快捷键说明

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