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

📄 events.c

📁 video linux conference
💻 C
📖 第 1 页 / 共 3 页
字号:
            }            break;        default:            /* Messages we don't handle directly are dispatched to the             * window procedure */            TranslateMessage(&msg);            DispatchMessage(&msg);            break;        } /* End Switch */    } /* End Main loop */    /* Check for WM_QUIT if we created the window */    if( !p_event->p_vout->p_sys->hparent && msg.message == WM_QUIT )    {        msg_Warn( p_event, "WM_QUIT... should not happen!!" );        p_event->p_vout->p_sys->hwnd = NULL; /* Window already destroyed */    }    msg_Dbg( p_event, "DirectXEventThread terminating" );    /* clear the changes formerly signaled */    p_event->p_vout->p_sys->i_changes = 0;    DirectXCloseWindow( p_event->p_vout );}/* following functions are local *//***************************************************************************** * DirectXCreateWindow: create a window for the video. ***************************************************************************** * Before creating a direct draw surface, we need to create a window in which * the video will be displayed. This window will also allow us to capture the * events. *****************************************************************************/static int DirectXCreateWindow( vout_thread_t *p_vout ){    HINSTANCE  hInstance;    HMENU      hMenu;    RECT       rect_window;    WNDCLASS   wc;                            /* window class components */    HICON      vlc_icon = NULL;    char       vlc_path[MAX_PATH+1];    int        i_style, i_stylex;    msg_Dbg( p_vout, "DirectXCreateWindow" );    /* Get this module's instance */    hInstance = GetModuleHandle(NULL);    /* If an external window was specified, we'll draw in it. */    p_vout->p_sys->hparent =        vout_RequestWindow( p_vout, &p_vout->p_sys->i_window_x,                            &p_vout->p_sys->i_window_y,                            &p_vout->p_sys->i_window_width,                            &p_vout->p_sys->i_window_height );    /* We create the window ourself, there is no previous window proc. */    p_vout->p_sys->pf_wndproc = NULL;    /* Get the Icon from the main app */    vlc_icon = NULL;#ifndef UNDER_CE    if( GetModuleFileName( NULL, vlc_path, MAX_PATH ) )    {        vlc_icon = ExtractIcon( hInstance, vlc_path, 0 );    }#endif    /* Fill in the window class structure */    wc.style         = CS_OWNDC|CS_DBLCLKS;          /* style: dbl click */    wc.lpfnWndProc   = (WNDPROC)DirectXEventProc;       /* event handler */    wc.cbClsExtra    = 0;                         /* no extra class data */    wc.cbWndExtra    = 0;                        /* no extra window data */    wc.hInstance     = hInstance;                            /* instance */    wc.hIcon         = vlc_icon;                /* load the vlc big icon */    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);    /* default cursor */    wc.hbrBackground = GetStockObject(BLACK_BRUSH);  /* background color */    wc.lpszMenuName  = NULL;                                  /* no menu */    wc.lpszClassName = _T("VLC DirectX");         /* use a special class */    /* Register the window class */    if( !RegisterClass(&wc) )    {        WNDCLASS wndclass;        if( vlc_icon ) DestroyIcon( vlc_icon );        /* Check why it failed. If it's because one already exists         * then fine, otherwise return with an error. */        if( !GetClassInfo( hInstance, _T("VLC DirectX"), &wndclass ) )        {            msg_Err( p_vout, "DirectXCreateWindow RegisterClass FAILED" );            return VLC_EGENERIC;        }    }    /* Register the video sub-window class */    wc.lpszClassName = _T("VLC DirectX video"); wc.hIcon = 0;    if( !RegisterClass(&wc) )    {        WNDCLASS wndclass;        /* Check why it failed. If it's because one already exists         * then fine, otherwise return with an error. */        if( !GetClassInfo( hInstance, _T("VLC DirectX video"), &wndclass ) )        {            msg_Err( p_vout, "DirectXCreateWindow RegisterClass FAILED" );            return VLC_EGENERIC;        }    }    /* When you create a window you give the dimensions you wish it to     * have. Unfortunatly these dimensions will include the borders and     * titlebar. We use the following function to find out the size of     * the window corresponding to the useable surface we want */    rect_window.top    = 10;    rect_window.left   = 10;    rect_window.right  = rect_window.left + p_vout->p_sys->i_window_width;    rect_window.bottom = rect_window.top + p_vout->p_sys->i_window_height;    if( var_GetBool( p_vout, "video-deco" ) )    {        /* Open with window decoration */        AdjustWindowRect( &rect_window, WS_OVERLAPPEDWINDOW|WS_SIZEBOX, 0 );        i_style = WS_OVERLAPPEDWINDOW|WS_SIZEBOX|WS_VISIBLE|WS_CLIPCHILDREN;        i_stylex = 0;    }    else    {        /* No window decoration */        AdjustWindowRect( &rect_window, WS_POPUP, 0 );        i_style = WS_POPUP|WS_VISIBLE|WS_CLIPCHILDREN;        i_stylex = 0; // WS_EX_TOOLWINDOW; Is TOOLWINDOW really needed ?                      // It messes up the fullscreen window.    }    if( p_vout->p_sys->hparent )    {        i_style = WS_VISIBLE|WS_CLIPCHILDREN|WS_CHILD;        i_stylex = 0;    }    p_vout->p_sys->i_window_style = i_style;    /* Create the window */    p_vout->p_sys->hwnd =        CreateWindowEx( WS_EX_NOPARENTNOTIFY | i_stylex,                    _T("VLC DirectX"),               /* name of window class */                    _T(VOUT_TITLE) _T(" (DirectX Output)"),  /* window title */                    i_style,                                 /* window style */                    (p_vout->p_sys->i_window_x < 0) ? CW_USEDEFAULT :                        p_vout->p_sys->i_window_x,   /* default X coordinate */                    (p_vout->p_sys->i_window_y < 0) ? CW_USEDEFAULT :                        p_vout->p_sys->i_window_y,   /* default Y coordinate */                    rect_window.right - rect_window.left,    /* window width */                    rect_window.bottom - rect_window.top,   /* window height */                    p_vout->p_sys->hparent,                 /* parent window */                    NULL,                          /* no menu in this window */                    hInstance,            /* handle of this program instance */                    (LPVOID)p_vout );            /* send p_vout to WM_CREATE */    if( !p_vout->p_sys->hwnd )    {        msg_Warn( p_vout, "DirectXCreateWindow create window FAILED" );        return VLC_EGENERIC;    }    if( p_vout->p_sys->hparent )    {        LONG i_style;        /* We don't want the window owner to overwrite our client area */        i_style = GetWindowLong( p_vout->p_sys->hparent, GWL_STYLE );        if( !(i_style & WS_CLIPCHILDREN) )            /* Hmmm, apparently this is a blocking call... */            SetWindowLong( p_vout->p_sys->hparent, GWL_STYLE,                           i_style | WS_CLIPCHILDREN );        /* Create our fullscreen window */        p_vout->p_sys->hfswnd =            CreateWindowEx( WS_EX_APPWINDOW, _T("VLC DirectX"),                            _T(VOUT_TITLE) _T(" (DirectX Output)"),                            WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN|WS_SIZEBOX,                            CW_USEDEFAULT, CW_USEDEFAULT,                            CW_USEDEFAULT, CW_USEDEFAULT,                            NULL, NULL, hInstance, NULL );    }    /* Now display the window */    ShowWindow( p_vout->p_sys->hwnd, SW_SHOW );    /* Create video sub-window. This sub window will always exactly match     * the size of the video, which allows us to use crazy overlay colorkeys     * without having them shown outside of the video area. */    SendMessage( p_vout->p_sys->hwnd, WM_VLC_CREATE_VIDEO_WIN, 0, 0 );    /* Append a "Always On Top" entry in the system menu */    hMenu = GetSystemMenu( p_vout->p_sys->hwnd, FALSE );    AppendMenu( hMenu, MF_SEPARATOR, 0, _T("") );    AppendMenu( hMenu, MF_STRING | MF_UNCHECKED,                       IDM_TOGGLE_ON_TOP, _T("Always on &Top") );    return VLC_SUCCESS;}/***************************************************************************** * DirectXCloseWindow: close the window created by DirectXCreateWindow ***************************************************************************** * This function returns all resources allocated by DirectXCreateWindow. *****************************************************************************/static void DirectXCloseWindow( vout_thread_t *p_vout ){    msg_Dbg( p_vout, "DirectXCloseWindow" );    DestroyWindow( p_vout->p_sys->hwnd );    if( p_vout->p_sys->hfswnd ) DestroyWindow( p_vout->p_sys->hfswnd );    if( p_vout->p_sys->hparent )        vout_ReleaseWindow( p_vout, (void *)p_vout->p_sys->hparent );    p_vout->p_sys->hwnd = NULL;    /* We don't unregister the Window Class because it could lead to race     * conditions and it will be done anyway by the system when the app will     * exit */}/***************************************************************************** * DirectXUpdateRects: update clipping rectangles ***************************************************************************** * This function is called when the window position or size are changed, and * its job is to update the source and destination RECTs used to display the * picture. *****************************************************************************/void E_(DirectXUpdateRects)( vout_thread_t *p_vout, vlc_bool_t b_force ){#define rect_src p_vout->p_sys->rect_src#define rect_src_clipped p_vout->p_sys->rect_src_clipped#define rect_dest p_vout->p_sys->rect_dest#define rect_dest_clipped p_vout->p_sys->rect_dest_clipped    int i_width, i_height, i_x, i_y;    RECT  rect;    POINT point;    /* Retrieve the window size */    GetClientRect( p_vout->p_sys->hwnd, &rect );    /* Retrieve the window position */    point.x = point.y = 0;    ClientToScreen( p_vout->p_sys->hwnd, &point );    /* If nothing changed, we can return */    if( !b_force         && p_vout->p_sys->i_window_width == rect.right         && p_vout->p_sys->i_window_height == rect.bottom         && p_vout->p_sys->i_window_x == point.x         && p_vout->p_sys->i_window_y == point.y )    {        return;    }    /* Update the window position and size */    p_vout->p_sys->i_window_x = point.x;    p_vout->p_sys->i_window_y = point.y;    p_vout->p_sys->i_window_width = rect.right;    p_vout->p_sys->i_window_height = rect.bottom;    vout_PlacePicture( p_vout, rect.right, rect.bottom,                       &i_x, &i_y, &i_width, &i_height );    if( p_vout->p_sys->hvideownd )        SetWindowPos( p_vout->p_sys->hvideownd, HWND_TOP,                      i_x, i_y, i_width, i_height, 0 );    /* Destination image position and dimensions */    rect_dest.left = point.x + i_x;    rect_dest.right = rect_dest.left + i_width;    rect_dest.top = point.y + i_y;    rect_dest.bottom = rect_dest.top + i_height;    /* Apply overlay hardware constraints */    if( p_vout->p_sys->b_using_overlay )    {        if( p_vout->p_sys->i_align_dest_boundary )            rect_dest.left = ( rect_dest.left +                p_vout->p_sys->i_align_dest_boundary / 2 ) &                 ~p_vout->p_sys->i_align_dest_boundary;        if( p_vout->p_sys->i_align_dest_size )            rect_dest.right = (( rect_dest.right - rect_dest.left +                p_vout->p_sys->i_align_dest_size / 2 ) &                 ~p_vout->p_sys->i_align_dest_size) + rect_dest.left;    }    /* UpdateOverlay directdraw function doesn't automatically clip to the     * display size so we need to do it otherwise it will fail */    /* Clip the destination window */    if( !IntersectRect( &rect_dest_clipped, &rect_dest,                        &p_vout->p_sys->rect_display ) )    {        SetRectEmpty( &rect_src_clipped );        return;    }#if 0    msg_Dbg( p_vout, "DirectXUpdateRects image_dst_clipped coords:"                     " %i,%i,%i,%i",

⌨️ 快捷键说明

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