Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
7
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Open sidebar
Steve Lhomme
VLC
Commits
58f8e5c4
Commit
58f8e5c4
authored
Jul 23, 2004
by
Gildas Bazin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* modules/video_output/directx/glwin32.c: 1st shot at a win32 opengl provider.
* modules/video_output/directx/events.c: removed unused code.
parent
1eefd3dd
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
473 additions
and
70 deletions
+473
-70
modules/video_output/directx/Modules.am
modules/video_output/directx/Modules.am
+5
-0
modules/video_output/directx/events.c
modules/video_output/directx/events.c
+12
-70
modules/video_output/directx/glwin32.c
modules/video_output/directx/glwin32.c
+451
-0
modules/video_output/directx/vout.h
modules/video_output/directx/vout.h
+5
-0
No files found.
modules/video_output/directx/Modules.am
View file @
58f8e5c4
...
...
@@ -4,3 +4,8 @@ SOURCES_vout_directx = \
events.c \
$(NULL)
SOURCES_glwin32 = \
glwin32.c \
vout.h \
events.c \
$(NULL)
modules/video_output/directx/events.c
View file @
58f8e5c4
...
...
@@ -55,7 +55,6 @@
static
int
DirectXCreateWindow
(
vout_thread_t
*
p_vout
);
static
void
DirectXCloseWindow
(
vout_thread_t
*
p_vout
);
static
long
FAR
PASCAL
DirectXEventProc
(
HWND
,
UINT
,
WPARAM
,
LPARAM
);
static
long
FAR
PASCAL
DirectXVideoEventProc
(
HWND
,
UINT
,
WPARAM
,
LPARAM
);
static
int
Control
(
vout_thread_t
*
p_vout
,
int
i_query
,
va_list
args
);
...
...
@@ -298,6 +297,10 @@ void DirectXEventThread( event_thread_t *p_event )
if
(
!
val
.
psz_string
||
!*
val
.
psz_string
)
/* Default video title */
{
#ifdef MODULE_NAME_IS_glwin32
SetWindowText
(
p_event
->
p_vout
->
p_sys
->
hwnd
,
VOUT_TITLE
" (OpenGL output)"
);
#else
if
(
p_event
->
p_vout
->
p_sys
->
b_using_overlay
)
SetWindowText
(
p_event
->
p_vout
->
p_sys
->
hwnd
,
VOUT_TITLE
" (hardware YUV overlay DirectX output)"
);
...
...
@@ -306,6 +309,7 @@ void DirectXEventThread( event_thread_t *p_event )
VOUT_TITLE
" (hardware YUV DirectX output)"
);
else
SetWindowText
(
p_event
->
p_vout
->
p_sys
->
hwnd
,
VOUT_TITLE
" (software RGB DirectX output)"
);
#endif
}
else
{
...
...
@@ -383,7 +387,7 @@ static int DirectXCreateWindow( vout_thread_t *p_vout )
/* Fill in the window class structure */
wc
.
cbSize
=
sizeof
(
WNDCLASSEX
);
wc
.
style
=
CS_
DBLCLKS
;
/* style: dbl click */
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 */
...
...
@@ -460,7 +464,6 @@ static int DirectXCreateWindow( vout_thread_t *p_vout )
/* Hmmm, apparently this is a blocking call... */
SetWindowLong
(
p_vout
->
p_sys
->
hparent
,
GWL_STYLE
,
i_style
|
WS_CLIPCHILDREN
);
}
/* Now display the window */
...
...
@@ -689,6 +692,9 @@ static long FAR PASCAL DirectXEventProc( HWND hwnd, UINT message,
return
DefWindowProc
(
hwnd
,
message
,
wParam
,
lParam
);
}
if
(
hwnd
==
p_vout
->
p_sys
->
hvideownd
)
return
DefWindowProc
(
hwnd
,
message
,
wParam
,
lParam
);
switch
(
message
)
{
...
...
@@ -746,28 +752,18 @@ static long FAR PASCAL DirectXEventProc( HWND hwnd, UINT message,
case
WM_VLC_CREATE_VIDEO_WIN
:
/* Create video sub-window */
p_vout
->
p_sys
->
hvideownd
=
CreateWindow
(
"
STATIC
"
,
""
,
/* window class
and
title bar text */
CreateWindow
(
"
VLC DirectX
"
,
""
,
/* window class
/
title bar text */
WS_CHILD
|
WS_VISIBLE
,
/* window style */
CW_USEDEFAULT
,
CW_USEDEFAULT
,
/* default coordinates */
CW_USEDEFAULT
,
CW_USEDEFAULT
,
hwnd
,
/* parent window */
NULL
,
GetModuleHandle
(
NULL
),
NULL
);
NULL
,
GetModuleHandle
(
NULL
),
(
LPVOID
)
p_vout
);
/* send p_vout to WM_CREATE */
if
(
!
p_vout
->
p_sys
->
hvideownd
)
{
msg_Warn
(
p_vout
,
"Can't create video sub-window"
);
}
else
{
msg_Dbg
(
p_vout
,
"Created video sub-window"
);
SetWindowLongPtr
(
p_vout
->
p_sys
->
hvideownd
,
GWLP_WNDPROC
,
(
LONG_PTR
)
DirectXVideoEventProc
);
/* Store the previous window proc of _this_ window with the video
* window so we can use it in DirectXVideoEventProc to pass
* messages to the creator of _this_ window */
SetWindowLongPtr
(
p_vout
->
p_sys
->
hvideownd
,
GWLP_USERDATA
,
(
LONG_PTR
)
p_vout
->
p_sys
->
pf_wndproc
);
}
break
;
case
WM_PAINT
:
...
...
@@ -787,60 +783,6 @@ static long FAR PASCAL DirectXEventProc( HWND hwnd, UINT message,
return
DefWindowProc
(
hwnd
,
message
,
wParam
,
lParam
);
}
static
long
FAR
PASCAL
DirectXVideoEventProc
(
HWND
hwnd
,
UINT
message
,
WPARAM
wParam
,
LPARAM
lParam
)
{
WNDPROC
pf_parentwndproc
;
POINT
pt
;
switch
(
message
)
{
case
WM_MOUSEMOVE
:
case
WM_LBUTTONDOWN
:
case
WM_LBUTTONUP
:
case
WM_LBUTTONDBLCLK
:
case
WM_MBUTTONDOWN
:
case
WM_MBUTTONUP
:
case
WM_RBUTTONDOWN
:
case
WM_RBUTTONUP
:
/* Translate mouse cursor position to parent window coordinates. */
pt
.
x
=
LOWORD
(
lParam
);
pt
.
y
=
HIWORD
(
lParam
);
MapWindowPoints
(
hwnd
,
GetParent
(
hwnd
),
&
pt
,
1
);
lParam
=
MAKELPARAM
(
pt
.
x
,
pt
.
y
);
/* Fall through. */
case
WM_KEYDOWN
:
case
WM_KEYUP
:
case
WM_SYSKEYDOWN
:
case
WM_SYSKEYUP
:
/* Foward these to the original window proc of the parent so the
* creator of the window gets a chance to process them. If we created
* the parent window ourself DirectXEventThread will process these
* and they will never make it here.
* Note that we fake the hwnd to be our parent in order to prevent
* confusion in the creator's window proc. */
pf_parentwndproc
=
(
WNDPROC
)
GetWindowLongPtr
(
hwnd
,
GWLP_USERDATA
);
if
(
pf_parentwndproc
)
{
LRESULT
i_ret
;
LONG_PTR
p_backup
;
pf_parentwndproc
=
(
WNDPROC
)
GetWindowLongPtr
(
hwnd
,
GWLP_USERDATA
);
p_backup
=
SetWindowLongPtr
(
GetParent
(
hwnd
),
GWLP_USERDATA
,
0
);
i_ret
=
CallWindowProc
(
pf_parentwndproc
,
GetParent
(
hwnd
),
message
,
wParam
,
lParam
);
SetWindowLongPtr
(
GetParent
(
hwnd
),
GWLP_USERDATA
,
p_backup
);
return
i_ret
;
}
break
;
}
return
DefWindowProc
(
hwnd
,
message
,
wParam
,
lParam
);
}
static
struct
{
int
i_dxkey
;
...
...
modules/video_output/directx/glwin32.c
0 → 100644
View file @
58f8e5c4
/*****************************************************************************
* glwin32.c: Windows OpenGL provider
*****************************************************************************
* Copyright (C) 2001-2004 VideoLAN
* $Id$
*
* Authors: Gildas Bazin <gbazin@videolan.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
#include <errno.h>
/* ENOMEM */
#include <stdlib.h>
/* free() */
#include <string.h>
/* strerror() */
#include <vlc/vlc.h>
#include <vlc/intf.h>
#include <vlc/vout.h>
#include <windows.h>
#include <ddraw.h>
#include <commctrl.h>
#include <multimon.h>
#undef GetSystemMetrics
#ifndef MONITOR_DEFAULTTONEAREST
# define MONITOR_DEFAULTTONEAREST 2
#endif
#include <GL/gl.h>
#include "vout.h"
/*****************************************************************************
* Local prototypes.
*****************************************************************************/
static
int
OpenVideo
(
vlc_object_t
*
);
static
void
CloseVideo
(
vlc_object_t
*
);
static
int
Init
(
vout_thread_t
*
);
static
void
End
(
vout_thread_t
*
);
static
int
Manage
(
vout_thread_t
*
);
static
void
GLSwapBuffers
(
vout_thread_t
*
);
/*****************************************************************************
* Module descriptor
*****************************************************************************/
vlc_module_begin
();
set_description
(
_
(
"Win32 OpenGL provider"
)
);
set_capability
(
"opengl provider"
,
100
);
add_shortcut
(
"glwin32"
);
set_callbacks
(
OpenVideo
,
CloseVideo
);
vlc_module_end
();
#if 0 /* FIXME */
/* check if we registered a window class because we need to
* unregister it */
WNDCLASS wndclass;
if( GetClassInfo( GetModuleHandle(NULL), "VLC DirectX", &wndclass ) )
UnregisterClass( "VLC DirectX", GetModuleHandle(NULL) );
#endif
/*****************************************************************************
* OpenVideo: allocate OpenGL provider
*****************************************************************************
* This function creates and initializes a video window.
*****************************************************************************/
static
int
OpenVideo
(
vlc_object_t
*
p_this
)
{
vout_thread_t
*
p_vout
=
(
vout_thread_t
*
)
p_this
;
vlc_value_t
val
;
/* Allocate structure */
p_vout
->
p_sys
=
malloc
(
sizeof
(
vout_sys_t
)
);
if
(
p_vout
->
p_sys
==
NULL
)
{
msg_Err
(
p_vout
,
"out of memory"
);
return
VLC_ENOMEM
;
}
memset
(
p_vout
->
p_sys
,
0
,
sizeof
(
vout_sys_t
)
);
/* Initialisations */
p_vout
->
pf_init
=
Init
;
p_vout
->
pf_end
=
End
;
p_vout
->
pf_manage
=
Manage
;
p_vout
->
pf_swap
=
GLSwapBuffers
;
p_vout
->
p_sys
->
p_ddobject
=
NULL
;
p_vout
->
p_sys
->
p_display
=
NULL
;
p_vout
->
p_sys
->
p_current_surface
=
NULL
;
p_vout
->
p_sys
->
p_clipper
=
NULL
;
p_vout
->
p_sys
->
hwnd
=
p_vout
->
p_sys
->
hvideownd
=
NULL
;
p_vout
->
p_sys
->
hparent
=
NULL
;
p_vout
->
p_sys
->
i_changes
=
0
;
p_vout
->
p_sys
->
b_wallpaper
=
0
;
vlc_mutex_init
(
p_vout
,
&
p_vout
->
p_sys
->
lock
);
SetRectEmpty
(
&
p_vout
->
p_sys
->
rect_display
);
SetRectEmpty
(
&
p_vout
->
p_sys
->
rect_parent
);
var_Create
(
p_vout
,
"video-title"
,
VLC_VAR_STRING
|
VLC_VAR_DOINHERIT
);
p_vout
->
p_sys
->
b_cursor_hidden
=
0
;
p_vout
->
p_sys
->
i_lastmoved
=
mdate
();
/* Set main window's size */
p_vout
->
p_sys
->
i_window_width
=
p_vout
->
i_window_width
;
p_vout
->
p_sys
->
i_window_height
=
p_vout
->
i_window_height
;
/* Create the DirectXEventThread, this thread is created by us to isolate
* the Win32 PeekMessage function calls. We want to do this because
* Windows can stay blocked inside this call for a long time, and when
* this happens it thus blocks vlc's video_output thread.
* DirectXEventThread will take care of the creation of the video
* window (because PeekMessage has to be called from the same thread which
* created the window). */
msg_Dbg
(
p_vout
,
"creating DirectXEventThread"
);
p_vout
->
p_sys
->
p_event
=
vlc_object_create
(
p_vout
,
sizeof
(
event_thread_t
)
);
p_vout
->
p_sys
->
p_event
->
p_vout
=
p_vout
;
if
(
vlc_thread_create
(
p_vout
->
p_sys
->
p_event
,
"DirectX Events Thread"
,
DirectXEventThread
,
0
,
1
)
)
{
msg_Err
(
p_vout
,
"cannot create DirectXEventThread"
);
vlc_object_destroy
(
p_vout
->
p_sys
->
p_event
);
p_vout
->
p_sys
->
p_event
=
NULL
;
goto
error
;
}
if
(
p_vout
->
p_sys
->
p_event
->
b_error
)
{
msg_Err
(
p_vout
,
"DirectXEventThread failed"
);
goto
error
;
}
vlc_object_attach
(
p_vout
->
p_sys
->
p_event
,
p_vout
);
msg_Dbg
(
p_vout
,
"DirectXEventThread running"
);
/* Variable to indicate if the window should be on top of others */
/* Trigger a callback right now */
var_Get
(
p_vout
,
"video-on-top"
,
&
val
);
var_Set
(
p_vout
,
"video-on-top"
,
val
);
return
VLC_SUCCESS
;
error:
CloseVideo
(
VLC_OBJECT
(
p_vout
)
);
return
VLC_EGENERIC
;
}
/*****************************************************************************
* Init: initialize video thread output method
*****************************************************************************/
static
int
Init
(
vout_thread_t
*
p_vout
)
{
PIXELFORMATDESCRIPTOR
pfd
;
int
iFormat
;
/* Change the window title bar text */
PostMessage
(
p_vout
->
p_sys
->
hwnd
,
WM_VLC_CHANGE_TEXT
,
0
,
0
);
p_vout
->
p_sys
->
hGLDC
=
GetDC
(
p_vout
->
p_sys
->
hvideownd
);
/* Set the pixel format for the DC */
memset
(
&
pfd
,
0
,
sizeof
(
pfd
)
);
pfd
.
nSize
=
sizeof
(
pfd
);
pfd
.
nVersion
=
1
;
pfd
.
dwFlags
=
PFD_DRAW_TO_WINDOW
|
PFD_SUPPORT_OPENGL
|
PFD_DOUBLEBUFFER
;
pfd
.
iPixelType
=
PFD_TYPE_RGBA
;
pfd
.
cColorBits
=
24
;
pfd
.
cDepthBits
=
16
;
pfd
.
iLayerType
=
PFD_MAIN_PLANE
;
iFormat
=
ChoosePixelFormat
(
p_vout
->
p_sys
->
hGLDC
,
&
pfd
);
SetPixelFormat
(
p_vout
->
p_sys
->
hGLDC
,
iFormat
,
&
pfd
);
/* Create and enable the render context */
p_vout
->
p_sys
->
hGLRC
=
wglCreateContext
(
p_vout
->
p_sys
->
hGLDC
);
wglMakeCurrent
(
p_vout
->
p_sys
->
hGLDC
,
p_vout
->
p_sys
->
hGLRC
);
return
VLC_SUCCESS
;
}
/*****************************************************************************
* End: terminate Sys video thread output method
*****************************************************************************
* Terminate an output method created by Create.
* It is called at the end of the thread.
*****************************************************************************/
static
void
End
(
vout_thread_t
*
p_vout
)
{
wglMakeCurrent
(
NULL
,
NULL
);
wglDeleteContext
(
p_vout
->
p_sys
->
hGLRC
);
ReleaseDC
(
p_vout
->
p_sys
->
hvideownd
,
p_vout
->
p_sys
->
hGLDC
);
return
;
}
/*****************************************************************************
* CloseVideo: destroy Sys video thread output method
*****************************************************************************
* Terminate an output method created by Create
*****************************************************************************/
static
void
CloseVideo
(
vlc_object_t
*
p_this
)
{
vout_thread_t
*
p_vout
=
(
vout_thread_t
*
)
p_this
;
msg_Dbg
(
p_vout
,
"CloseVideo"
);
if
(
p_vout
->
p_sys
->
p_event
)
{
vlc_object_detach
(
p_vout
->
p_sys
->
p_event
);
/* Kill DirectXEventThread */
p_vout
->
p_sys
->
p_event
->
b_die
=
VLC_TRUE
;
/* we need to be sure DirectXEventThread won't stay stuck in
* GetMessage, so we send a fake message */
if
(
p_vout
->
p_sys
->
hwnd
)
{
PostMessage
(
p_vout
->
p_sys
->
hwnd
,
WM_NULL
,
0
,
0
);
}
vlc_thread_join
(
p_vout
->
p_sys
->
p_event
);
vlc_object_destroy
(
p_vout
->
p_sys
->
p_event
);
}
vlc_mutex_destroy
(
&
p_vout
->
p_sys
->
lock
);
if
(
p_vout
->
p_sys
)
{
free
(
p_vout
->
p_sys
);
p_vout
->
p_sys
=
NULL
;
}
}
/*****************************************************************************
* Manage: handle Sys events
*****************************************************************************
* This function should be called regularly by the video output thread.
* It returns a non null value if an error occured.
*****************************************************************************/
static
int
Manage
(
vout_thread_t
*
p_vout
)
{
WINDOWPLACEMENT
window_placement
;
int
i_width
=
p_vout
->
p_sys
->
rect_dest
.
right
-
p_vout
->
p_sys
->
rect_dest
.
left
;
int
i_height
=
p_vout
->
p_sys
->
rect_dest
.
bottom
-
p_vout
->
p_sys
->
rect_dest
.
top
;
glViewport
(
0
,
0
,
i_width
,
i_height
);
/* If we do not control our window, we check for geometry changes
* ourselves because the parent might not send us its events. */
vlc_mutex_lock
(
&
p_vout
->
p_sys
->
lock
);
if
(
p_vout
->
p_sys
->
hparent
&&
!
p_vout
->
b_fullscreen
)
{
RECT
rect_parent
;
POINT
point
;
vlc_mutex_unlock
(
&
p_vout
->
p_sys
->
lock
);
GetClientRect
(
p_vout
->
p_sys
->
hparent
,
&
rect_parent
);
point
.
x
=
point
.
y
=
0
;
ClientToScreen
(
p_vout
->
p_sys
->
hparent
,
&
point
);
OffsetRect
(
&
rect_parent
,
point
.
x
,
point
.
y
);
if
(
!
EqualRect
(
&
rect_parent
,
&
p_vout
->
p_sys
->
rect_parent
)
)
{
p_vout
->
p_sys
->
rect_parent
=
rect_parent
;
/* This one is to force the update even if only
* the position has changed */
SetWindowPos
(
p_vout
->
p_sys
->
hwnd
,
0
,
1
,
1
,
rect_parent
.
right
-
rect_parent
.
left
,
rect_parent
.
bottom
-
rect_parent
.
top
,
0
);
SetWindowPos
(
p_vout
->
p_sys
->
hwnd
,
0
,
0
,
0
,
rect_parent
.
right
-
rect_parent
.
left
,
rect_parent
.
bottom
-
rect_parent
.
top
,
0
);
}
}
else
{
vlc_mutex_unlock
(
&
p_vout
->
p_sys
->
lock
);
}
/* We used to call the Win32 PeekMessage function here to read the window
* messages. But since window can stay blocked into this function for a
* long time (for example when you move your window on the screen), I
* decided to isolate PeekMessage in another thread. */
/*
* Fullscreen change
*/
if
(
p_vout
->
i_changes
&
VOUT_FULLSCREEN_CHANGE
||
p_vout
->
p_sys
->
i_changes
&
VOUT_FULLSCREEN_CHANGE
)
{
int
i_style
=
0
;
vlc_value_t
val
;
p_vout
->
b_fullscreen
=
!
p_vout
->
b_fullscreen
;
/* We need to switch between Maximized and Normal sized window */
window_placement
.
length
=
sizeof
(
WINDOWPLACEMENT
);
if
(
p_vout
->
b_fullscreen
)
{
if
(
p_vout
->
p_sys
->
hparent
)
{
POINT
point
;
/* Retrieve the window position */
point
.
x
=
point
.
y
=
0
;
ClientToScreen
(
p_vout
->
p_sys
->
hwnd
,
&
point
);
SetParent
(
p_vout
->
p_sys
->
hwnd
,
GetDesktopWindow
()
);
SetWindowPos
(
p_vout
->
p_sys
->
hwnd
,
0
,
point
.
x
,
point
.
y
,
0
,
0
,
SWP_NOSIZE
|
SWP_NOZORDER
|
SWP_FRAMECHANGED
);
SetForegroundWindow
(
p_vout
->
p_sys
->
hwnd
);
}
/* Maximized window */
GetWindowPlacement
(
p_vout
->
p_sys
->
hwnd
,
&
window_placement
);
window_placement
.
showCmd
=
SW_SHOWMAXIMIZED
;
/* Change window style, no borders and no title bar */
i_style
=
WS_CLIPCHILDREN
|
WS_VISIBLE
|
WS_POPUP
;
}
else
{
if
(
p_vout
->
p_sys
->
hparent
)
{
SetParent
(
p_vout
->
p_sys
->
hwnd
,
p_vout
->
p_sys
->
hparent
);
SetWindowPos
(
p_vout
->
p_sys
->
hwnd
,
0
,
0
,
0
,
0
,
0
,
SWP_NOSIZE
|
SWP_NOZORDER
|
SWP_FRAMECHANGED
);
i_style
=
WS_CLIPCHILDREN
|
WS_VISIBLE
|
WS_CHILD
;
SetForegroundWindow
(
p_vout
->
p_sys
->
hparent
);
}
else
{
i_style
=
WS_CLIPCHILDREN
|
WS_OVERLAPPEDWINDOW
|
WS_SIZEBOX
|
WS_VISIBLE
;
}
/* Normal window */
GetWindowPlacement
(
p_vout
->
p_sys
->
hwnd
,
&
window_placement
);
window_placement
.
showCmd
=
SW_SHOWNORMAL
;
/* Make sure the mouse cursor is displayed */
PostMessage
(
p_vout
->
p_sys
->
hwnd
,
WM_VLC_SHOW_MOUSE
,
0
,
0
);
}
/* Change window style, borders and title bar */
SetWindowLong
(
p_vout
->
p_sys
->
hwnd
,
GWL_STYLE
,
i_style
);
SetWindowPlacement
(
p_vout
->
p_sys
->
hwnd
,
&
window_placement
);
SetWindowPos
(
p_vout
->
p_sys
->
hwnd
,
0
,
0
,
0
,
0
,
0
,
SWP_NOMOVE
|
SWP_NOSIZE
|
SWP_NOZORDER
|
SWP_FRAMECHANGED
);
/* Update the object variable and trigger callback */
val
.
b_bool
=
p_vout
->
b_fullscreen
;
var_Set
(
p_vout
,
"fullscreen"
,
val
);
p_vout
->
i_changes
&=
~
VOUT_FULLSCREEN_CHANGE
;
p_vout
->
p_sys
->
i_changes
&=
~
VOUT_FULLSCREEN_CHANGE
;
}
/*
* Pointer change
*/
if
(
p_vout
->
b_fullscreen
&&
!
p_vout
->
p_sys
->
b_cursor_hidden
&&
(
mdate
()
-
p_vout
->
p_sys
->
i_lastmoved
)
>
5000000
)
{
POINT
point
;
HWND
hwnd
;
/* Hide the cursor only if it is inside our window */
GetCursorPos
(
&
point
);
hwnd
=
WindowFromPoint
(
point
);
if
(
hwnd
==
p_vout
->
p_sys
->
hwnd
||
hwnd
==
p_vout
->
p_sys
->
hvideownd
)
{
PostMessage
(
p_vout
->
p_sys
->
hwnd
,
WM_VLC_HIDE_MOUSE
,
0
,
0
);
}
else
{
p_vout
->
p_sys
->
i_lastmoved
=
mdate
();
}
}
/*
* "Always on top" status change
*/
if
(
p_vout
->
p_sys
->
b_on_top_change
)
{
vlc_value_t
val
;
HMENU
hMenu
=
GetSystemMenu
(
p_vout
->
p_sys
->
hwnd
,
FALSE
);
var_Get
(
p_vout
,
"video-on-top"
,
&
val
);
/* Set the window on top if necessary */
if
(
val
.
b_bool
&&
!
(
GetWindowLong
(
p_vout
->
p_sys
->
hwnd
,
GWL_EXSTYLE
)
&
WS_EX_TOPMOST
)
)
{
CheckMenuItem
(
hMenu
,
IDM_TOGGLE_ON_TOP
,
MF_BYCOMMAND
|
MFS_CHECKED
);
SetWindowPos
(
p_vout
->
p_sys
->
hwnd
,
HWND_TOPMOST
,
0
,
0
,
0
,
0
,
SWP_NOSIZE
|
SWP_NOMOVE
);
}
else
/* The window shouldn't be on top */
if
(
!
val
.
b_bool
&&
(
GetWindowLong
(
p_vout
->
p_sys
->
hwnd
,
GWL_EXSTYLE
)
&
WS_EX_TOPMOST
)
)
{
CheckMenuItem
(
hMenu
,
IDM_TOGGLE_ON_TOP
,
MF_BYCOMMAND
|
MFS_UNCHECKED
);
SetWindowPos
(
p_vout
->
p_sys
->
hwnd
,
HWND_NOTOPMOST
,
0
,
0
,
0
,
0
,
SWP_NOSIZE
|
SWP_NOMOVE
);
}
p_vout
->
p_sys
->
b_on_top_change
=
VLC_FALSE
;
}
/* Check if the event thread is still running */
if
(
p_vout
->
p_sys
->
p_event
->
b_die
)
{
return
VLC_EGENERIC
;
/* exit */
}
return
VLC_SUCCESS
;
}
/*****************************************************************************
* GLSwapBuffers: swap front/back buffers
*****************************************************************************/
static
void
GLSwapBuffers
(
vout_thread_t
*
p_vout
)
{
SwapBuffers
(
p_vout
->
p_sys
->
hGLDC
);
}
int
DirectXUpdateOverlay
(
vout_thread_t
*
p_vout
)
{
return
1
;
}
modules/video_output/directx/vout.h
View file @
58f8e5c4
...
...
@@ -104,6 +104,11 @@ struct vout_sys_t
COLORREF
color_bkg
;
COLORREF
color_bkgtxt
;
#ifdef MODULE_NAME_IS_glwin32
HDC
hGLDC
;
HGLRC
hGLRC
;