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

📄 sdl.c

📁 VLC Player Source Code
💻 C
📖 第 1 页 / 共 3 页
字号:
    {        switch( event.type )        {        /* Resizing of window */        case SDL_VIDEORESIZE:            p_vout->i_changes |= VOUT_SIZE_CHANGE;            p_vout->i_window_width = p_vout->p_sys->i_width = event.resize.w;            p_vout->i_window_height = p_vout->p_sys->i_height = event.resize.h;            break;        /* Mouse move */        case SDL_MOUSEMOTION:            vout_PlacePicture( p_vout, p_vout->p_sys->i_width,                               p_vout->p_sys->i_height,                               &i_x, &i_y, &i_width, &i_height );            /* Compute the x coordinate and check if the value is               in [0,p_vout->fmt_in.i_visible_width] */            val.i_int = ( event.motion.x - i_x ) *                        p_vout->fmt_in.i_visible_width / i_width +                        p_vout->fmt_in.i_x_offset;            if( (int)(event.motion.x - i_x) < 0 )                val.i_int = 0;            else if( (unsigned int)val.i_int > p_vout->fmt_in.i_visible_width )                val.i_int = p_vout->fmt_in.i_visible_width;            var_Set( p_vout, "mouse-x", val );            /* compute the y coordinate and check if the value is               in [0,p_vout->fmt_in.i_visible_height] */            val.i_int = ( event.motion.y - i_y ) *                        p_vout->fmt_in.i_visible_height / i_height +                        p_vout->fmt_in.i_y_offset;            if( (int)(event.motion.y - i_y) < 0 )                val.i_int = 0;            else if( (unsigned int)val.i_int > p_vout->fmt_in.i_visible_height )                val.i_int = p_vout->fmt_in.i_visible_height;            var_Set( p_vout, "mouse-y", val );            val.b_bool = true;            var_Set( p_vout, "mouse-moved", val );            if( p_vout->p_sys->b_cursor )            {                if( p_vout->p_sys->b_cursor_autohidden )                {                    p_vout->p_sys->b_cursor_autohidden = 0;                    SDL_ShowCursor( 1 );                }                else                {                    p_vout->p_sys->i_lastmoved = mdate();                }            }            break;        /* Mouse button released */        case SDL_MOUSEBUTTONUP:            switch( event.button.button )            {            case SDL_BUTTON_LEFT:                {                    var_Get( p_vout, "mouse-button-down", &val );                    val.i_int &= ~1;                    var_Set( p_vout, "mouse-button-down", val );                    val.b_bool = true;                    var_Set( p_vout, "mouse-clicked", val );                    val.b_bool = false;                    var_Set( p_vout->p_libvlc, "intf-popupmenu", val );                }                break;            case SDL_BUTTON_MIDDLE:                {                    var_Get( p_vout, "mouse-button-down", &val );                    val.i_int &= ~2;                    var_Set( p_vout, "mouse-button-down", val );                    vlc_value_t val;                    var_Get( p_vout->p_libvlc, "intf-show", &val );                    val.b_bool = !val.b_bool;                    var_Set( p_vout->p_libvlc, "intf-show", val );                }                break;            case SDL_BUTTON_RIGHT:                {                    intf_thread_t *p_intf;                    var_Get( p_vout, "mouse-button-down", &val );                    val.i_int &= ~4;                    var_Set( p_vout, "mous-button-down", val );                    p_intf = vlc_object_find( p_vout, VLC_OBJECT_INTF,                                                      FIND_ANYWHERE );                    if( p_intf )                    {                        p_intf->b_menu_change = 1;                        vlc_object_release( p_intf );                    }                    val.b_bool = true;                    var_Set( p_vout->p_libvlc, "intf-popupmenu", val );                }                break;            }            break;        /* Mouse button pressed */        case SDL_MOUSEBUTTONDOWN:            switch( event.button.button )            {            case SDL_BUTTON_LEFT:                var_Get( p_vout, "mouse-button-down", &val );                val.i_int |= 1;                var_Set( p_vout, "mouse-button-down", val );                /* detect double-clicks */                if( ( mdate() - p_vout->p_sys->i_lastpressed ) < 300000 )                    p_vout->i_changes |= VOUT_FULLSCREEN_CHANGE;                p_vout->p_sys->i_lastpressed = mdate();                break;            case SDL_BUTTON_MIDDLE:                var_Get( p_vout, "mouse-button-down", &val );                val.i_int |= 2;                var_Set( p_vout, "mouse-button-down", val );                break;            case SDL_BUTTON_RIGHT:                var_Get( p_vout, "mouse-button-down", &val );                val.i_int |= 4;                var_Set( p_vout, "mouse-button-down", val );                break;            }            break;        /* Quit event (close the window) */        case SDL_QUIT:            {#if 0                playlist_t *p_playlist = pl_Yield( p_vout );                if( p_playlist != NULL )                {                    playlist_Stop( p_playlist );                    pl_Release( p_vout );                }#else#warning FIXME FIXME ?#endif            }            break;        /* Key pressed */        case SDL_KEYDOWN:            /* convert the key if possible */            val.i_int = ConvertKey( event.key.keysym.sym );            if( !val.i_int )            {                /* Find the right caracter */                if( ( event.key.keysym.unicode & 0xff80 ) == 0 )                {                    val.i_int = event.key.keysym.unicode & 0x7f;                    /* FIXME: find a better solution than this                              hack to find the right caracter */                    if( val.i_int >= 1 && val.i_int <= 26 )                        val.i_int += 96;                    else if( val.i_int >= 65 && val.i_int <= 90 )                        val.i_int += 32;                }            }            if( val.i_int )            {                if( ( event.key.keysym.mod & KMOD_SHIFT ) )                {                    val.i_int |= KEY_MODIFIER_SHIFT;                }                if( ( event.key.keysym.mod & KMOD_CTRL ) )                {                    val.i_int |= KEY_MODIFIER_CTRL;                }                if( ( event.key.keysym.mod & KMOD_ALT ) )                {                    val.i_int |= KEY_MODIFIER_ALT;                }                var_Set( p_vout->p_libvlc, "key-pressed", val );            }        default:            break;        }    }    /* Fullscreen change */    if( p_vout->i_changes & VOUT_FULLSCREEN_CHANGE )    {        vlc_value_t val_fs;        /* Update the object variable and trigger callback */        val_fs.b_bool = !p_vout->b_fullscreen;        p_vout->b_fullscreen = !p_vout->b_fullscreen;        var_Set( p_vout, "fullscreen", val_fs );        /*TODO: add the "always on top" code here !*/        p_vout->p_sys->b_cursor_autohidden = 0;        SDL_ShowCursor( p_vout->p_sys->b_cursor &&                        ! p_vout->p_sys->b_cursor_autohidden );        p_vout->i_changes &= ~VOUT_FULLSCREEN_CHANGE;        p_vout->i_changes |= VOUT_SIZE_CHANGE;    }    /* Crop or Aspect Ratio Changes */    if( p_vout->i_changes & VOUT_CROP_CHANGE ||        p_vout->i_changes & VOUT_ASPECT_CHANGE )    {        p_vout->i_changes &= ~VOUT_CROP_CHANGE;        p_vout->i_changes &= ~VOUT_ASPECT_CHANGE;        p_vout->fmt_out.i_x_offset = p_vout->fmt_in.i_x_offset;        p_vout->fmt_out.i_y_offset = p_vout->fmt_in.i_y_offset;        p_vout->fmt_out.i_visible_width = p_vout->fmt_in.i_visible_width;        p_vout->fmt_out.i_visible_height = p_vout->fmt_in.i_visible_height;        p_vout->fmt_out.i_aspect = p_vout->fmt_in.i_aspect;        p_vout->fmt_out.i_sar_num = p_vout->fmt_in.i_sar_num;        p_vout->fmt_out.i_sar_den = p_vout->fmt_in.i_sar_den;        p_vout->output.i_aspect = p_vout->fmt_in.i_aspect;        p_vout->i_changes |= VOUT_SIZE_CHANGE;    }    /* Size change */    if( p_vout->i_changes & VOUT_SIZE_CHANGE )    {        msg_Dbg( p_vout, "video display resized (%dx%d)",                 p_vout->p_sys->i_width, p_vout->p_sys->i_height );        CloseDisplay( p_vout );        OpenDisplay( p_vout );        /* We don't need to signal the vout thread about the size change if         * we can handle rescaling ourselves */        if( p_vout->p_sys->p_overlay != NULL )            p_vout->i_changes &= ~VOUT_SIZE_CHANGE;    }    /* Pointer change */    if( ! p_vout->p_sys->b_cursor_autohidden &&        ( mdate() - p_vout->p_sys->i_lastmoved >            p_vout->p_sys->i_mouse_hide_timeout ) )    {        /* Hide the mouse automatically */        p_vout->p_sys->b_cursor_autohidden = 1;        SDL_ShowCursor( 0 );    }    return VLC_SUCCESS;}/***************************************************************************** * Key events handling *****************************************************************************/static const struct{    SDLKey sdl_key;    int i_vlckey;} sdlkeys_to_vlckeys[] ={    { SDLK_F1,  KEY_F1 },    { SDLK_F2,  KEY_F2 },    { SDLK_F3,  KEY_F3 },    { SDLK_F4,  KEY_F4 },    { SDLK_F5,  KEY_F5 },    { SDLK_F6,  KEY_F6 },    { SDLK_F7,  KEY_F7 },    { SDLK_F8,  KEY_F8 },    { SDLK_F9,  KEY_F9 },    { SDLK_F10, KEY_F10 },    { SDLK_F11, KEY_F11 },    { SDLK_F12, KEY_F12 },    { SDLK_RETURN, KEY_ENTER },    { SDLK_KP_ENTER, KEY_ENTER },    { SDLK_SPACE, KEY_SPACE },    { SDLK_ESCAPE, KEY_ESC },    { SDLK_MENU, KEY_MENU },    { SDLK_LEFT, KEY_LEFT },    { SDLK_RIGHT, KEY_RIGHT },    { SDLK_UP, KEY_UP },    { SDLK_DOWN, KEY_DOWN },    { SDLK_HOME, KEY_HOME },    { SDLK_END, KEY_END },    { SDLK_PAGEUP, KEY_PAGEUP },    { SDLK_PAGEDOWN,  KEY_PAGEDOWN },    { SDLK_INSERT, KEY_INSERT },    { SDLK_DELETE, KEY_DELETE },    /*TODO: find a equivalent for SDL     { , KEY_MEDIA_NEXT_TRACK }    { , KEY_MEDIA_PREV_TRACK }    { , KEY_VOLUME_MUTE }    { , KEY_VOLUME_DOWN }    { , KEY_VOLUME_UP }    { , KEY_MEDIA_PLAY_PAUSE }    { , KEY_MEDIA_PLAY_PAUSE }*/    { 0, 0 }};static int ConvertKey( SDLKey sdl_key ){    int i;    for( i=0; sdlkeys_to_vlckeys[i].sdl_key != 0; i++ )    {        if( sdlkeys_to_vlckeys[i].sdl_key == sdl_key )        {            return sdlkeys_to_vlckeys[i].i_vlckey;        }    }    return 0;}/***************************************************************************** * Display: displays previously rendered output ***************************************************************************** * This function sends the currently rendered image to the display. *****************************************************************************/static void Display( vout_thread_t *p_vout, picture_t *p_pic ){    unsigned int x, y, w, h;    SDL_Rect disp;    vout_PlacePicture( p_vout, p_vout->p_sys->i_width, p_vout->p_sys->i_height,                       &x, &y, &w, &h );    disp.x = x;    disp.y = y;    disp.w = w;    disp.h = h;    if( p_vout->p_sys->p_overlay == NULL )    {        /* RGB picture */        SDL_Flip( p_vout->p_sys->p_display );    }    else    {        /* Overlay picture */        SDL_UnlockYUVOverlay( p_pic->p_sys->p_overlay);        SDL_DisplayYUVOverlay( p_pic->p_sys->p_overlay , &disp );        SDL_LockYUVOverlay( p_pic->p_sys->p_overlay);    }}/* following functions are local *//***************************************************************************** * OpenDisplay: open and initialize SDL device ***************************************************************************** * Open and initialize display according to preferences specified in the vout

⌨️ 快捷键说明

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