Make X11 window creation and (with -fixed-vo) management simpler and more

consistent by introducing a new function that handles most of the
ugly things. Changes of behaviour with some vos is unavoidable, bug reports
welcome.


git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@23675 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
reimar 2007-06-27 10:26:13 +00:00
parent b4be37acaf
commit f131aafff1
11 changed files with 89 additions and 265 deletions

View File

@ -616,22 +616,13 @@ static int config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_
depth = 24;
}
XMatchVisualInfo(mDisplay, mScreen, depth, TrueColor, &vinfo);
vo_x11_create_vo_window(&vinfo, vo_dx, vo_dy,
d_width, d_height, flags,
CopyFromParent, "Viewing Window", title);
xswa.background_pixel = KEY_COLOR;
xswa.border_pixel = 0;
xswamask = CWBackPixel | CWBorderPixel;
hint.y = vo_dy;
hint.x = vo_dx;
hint.base_width = hint.width = vo_dwidth;
hint.base_height = hint.height = vo_dheight;
hint.flags = PPosition | PSize;
vo_window = XCreateWindow(mDisplay, mRootWin, hint.x, hint.y, hint.width, hint.height, 0, depth, CopyFromParent, vinfo.visual, xswamask, &xswa);
vo_x11_classhint(mDisplay, vo_window, "Viewing Window");
vo_hidecursor(mDisplay, vo_window);
vo_x11_selectinput_witherr(mDisplay, vo_window, StructureNotifyMask | KeyPressMask | PropertyChangeMask);
XSetStandardProperties(mDisplay, vo_window, "DXR3 Overlay", "DXR3 Overlay", None, NULL, 0, &hint);
XSetWMNormalHints(mDisplay, vo_window, &hint);
XMapWindow(mDisplay, vo_window);
XSync(mDisplay, False);
XChangeWindowAttributes(mDisplay, vo_window, xswamask, &xswa);
}
/* Start setting up overlay */

View File

@ -470,65 +470,18 @@ config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uin
ButtonPressMask | ButtonReleaseMask | ExposureMask);
goto glconfig;
}
if ( vo_window == None ) {
unsigned int fg, bg;
XSizeHints hint;
XVisualInfo *vinfo;
XEvent xev;
vo_fs = VO_FALSE;
hint.x = vo_dx;
hint.y = vo_dy;
hint.width = d_width;
hint.height = d_height;
hint.flags = PPosition | PSize;
/* Get some colors */
bg = WhitePixel(mDisplay, mScreen);
fg = BlackPixel(mDisplay, mScreen);
/* Make the window */
vinfo=glXChooseVisual( mDisplay,mScreen,wsGLXAttrib );
{
XVisualInfo *vinfo=glXChooseVisual( mDisplay,mScreen,wsGLXAttrib );
if (vinfo == NULL)
{
mp_msg(MSGT_VO, MSGL_ERR, "[gl] no GLX support present\n");
return -1;
}
vo_window = vo_x11_create_smooth_window(mDisplay, mRootWin, vinfo->visual,
hint.x, hint.y, hint.width, hint.height, vinfo->depth,
XCreateColormap(mDisplay, mRootWin, vinfo->visual, AllocNone));
vo_x11_classhint( mDisplay,vo_window,"gl" );
vo_hidecursor(mDisplay,vo_window);
XSelectInput(mDisplay, vo_window, StructureNotifyMask);
/* Tell other applications about this window */
XSetStandardProperties(mDisplay, vo_window, title, title, None, NULL, 0, &hint);
/* Set the size hints. */
vo_x11_sizehint(hint.x, hint.y, hint.width, hint.height, 0);
/* Map window. */
XMapWindow(mDisplay, vo_window);
/* Wait for map. */
do {
XNextEvent(mDisplay, &xev);
} while (xev.type != MapNotify || xev.xmap.event != vo_window);
XSelectInput(mDisplay, vo_window, NoEventMask);
XSync(mDisplay, False);
vo_x11_selectinput_witherr(mDisplay, vo_window,
StructureNotifyMask | KeyPressMask | PointerMotionMask |
ButtonPressMask | ButtonReleaseMask | ExposureMask);
vo_x11_create_vo_window(vinfo, vo_dx, vo_dy, d_width, d_height, flags,
XCreateColormap(mDisplay, mRootWin, vinfo->visual, AllocNone),
"gl", title);
}
if (vo_ontop) vo_x11_setlayer(mDisplay, vo_window, vo_ontop);
vo_x11_nofs_sizepos(vo_dx, vo_dy, d_width, d_height);
if (vo_fs ^ (flags & VOFLAG_FULLSCREEN))
vo_x11_fullscreen();
#endif
glconfig:

View File

@ -518,6 +518,7 @@ static int choose_glx_visual(Display *dpy, int scr, XVisualInfo *res_vi)
}
static int config_glx(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint32_t flags, char *title, uint32_t format) {
XVisualInfo *vinfo, vinfo_buf;
if (WinID >= 0) {
vo_window = WinID ? (Window)WinID : mRootWin;
vo_x11_selectinput_witherr(mDisplay, vo_window,
@ -525,56 +526,14 @@ static int config_glx(uint32_t width, uint32_t height, uint32_t d_width, uint32_
ButtonPressMask | ButtonReleaseMask | ExposureMask);
return 0;
}
if ( vo_window == None ) {
XSizeHints hint;
XVisualInfo *vinfo, vinfo_buf;
XEvent xev;
hint.x = vo_dx;
hint.y = vo_dy;
hint.width = d_width;
hint.height = d_height;
hint.flags = PPosition | PSize;
/* Make the window */
vinfo = choose_glx_visual(mDisplay,mScreen,&vinfo_buf) < 0 ? NULL : &vinfo_buf;
if (vinfo == NULL) {
mp_msg(MSGT_VO, MSGL_FATAL, "[gl2] no GLX support present\n");
return -1;
}
vo_fs = VO_FALSE;
vo_window = vo_x11_create_smooth_window(mDisplay, RootWindow(mDisplay,mScreen),
vinfo->visual, hint.x, hint.y, hint.width, hint.height, vinfo->depth, vo_x11_create_colormap(vinfo));
vo_x11_classhint( mDisplay,vo_window,"gl2" );
vo_hidecursor(mDisplay,vo_window);
XSelectInput(mDisplay, vo_window, StructureNotifyMask);
/* Tell other applications about this window */
XSetStandardProperties(mDisplay, vo_window, title, title, None, NULL, 0, &hint);
/* Map window. */
XMapWindow(mDisplay, vo_window);
vo_x11_sizehint( hint.x, hint.y, hint.width, hint.height,0 );
XClearWindow(mDisplay,vo_window);
/* Wait for map. */
do {
XNextEvent(mDisplay, &xev);
} while (xev.type != MapNotify || xev.xmap.event != vo_window);
XSync(mDisplay, False);
//XSelectInput(mDisplay, vo_window, StructureNotifyMask); // !!!!
vo_x11_selectinput_witherr(mDisplay, vo_window, StructureNotifyMask | KeyPressMask | PointerMotionMask |
ButtonPressMask | ButtonReleaseMask | ExposureMask);
}
vo_x11_nofs_sizepos(vo_dx, vo_dy, d_width, d_height);
if (vo_fs ^ (flags & VOFLAG_FULLSCREEN))
vo_x11_fullscreen();
vo_x11_create_vo_window(vinfo, vo_dx, vo_dy, d_width, d_height,
flags, vo_x11_create_colormap(vinfo), "gl2", title);
return 0;
}

View File

@ -440,38 +440,12 @@ static int config(uint32_t width, uint32_t height, uint32_t d_width,
XSelectInput(mDisplay, vo_window, ExposureMask);
} else
{
if (vo_window == None)
{
vo_window =
vo_x11_create_smooth_window(mDisplay, mRootWin,
vinfo.visual, vo_dx, vo_dy,
vo_dwidth, vo_dheight,
depth, theCmap);
vo_x11_classhint(mDisplay, vo_window, "x11");
vo_hidecursor(mDisplay, vo_window);
vo_x11_sizehint(vo_dx, vo_dy, vo_dwidth, vo_dheight, 0);
XSelectInput(mDisplay, vo_window, StructureNotifyMask);
XStoreName(mDisplay, vo_window, title);
XMapWindow(mDisplay, vo_window);
// if(WinID!=0)
do
{
XNextEvent(mDisplay, &xev);
}
while (xev.type != MapNotify
|| xev.xmap.event != vo_window);
vo_x11_nofs_sizepos(vo_dx, vo_dy, vo_dwidth, vo_dheight);
if (fullscreen)
vo_x11_fullscreen();
} else
vo_x11_nofs_sizepos(vo_dx, vo_dy, vo_dwidth, vo_dheight);
vo_x11_create_vo_window(&vinfo, vo_dx, vo_dy, d_width, d_height,
flags, theCmap, "x11", title);
}
XSync(mDisplay, False);
// we cannot grab mouse events on root window :(
vo_x11_selectinput_witherr(mDisplay, vo_window,
StructureNotifyMask | KeyPressMask |
PropertyChangeMask | ExposureMask |

View File

@ -220,31 +220,8 @@ static int config(uint32_t width, uint32_t height, uint32_t d_width,
} else
{
if (vo_window == None)
{
vo_window = XCreateWindow(mDisplay, mRootWin,
vo_dx, vo_dy,
vo_dwidth, vo_dheight,
xWAttribs.border_pixel,
mDepth,
InputOutput,
vinfo.visual, xswamask,
&xWAttribs);
vo_x11_classhint(mDisplay, vo_window, "xmga");
vo_hidecursor(mDisplay, vo_window);
vo_x11_sizehint(vo_dx, vo_dy, vo_dwidth, vo_dheight, 0);
XStoreName(mDisplay, vo_window, mTitle);
XMapWindow(mDisplay, vo_window);
vo_x11_nofs_sizepos(vo_dx, vo_dy, vo_dwidth, vo_dheight);
if (flags & VOFLAG_FULLSCREEN)
vo_x11_fullscreen();
} else
vo_x11_nofs_sizepos(vo_dx, vo_dy, vo_dwidth, vo_dheight);
vo_x11_create_vo_window(&vinfo, vo_dx, vo_dy, d_width, d_height,
flags, InputOutput, "xmga", title);
}
if (vo_gc != None)

View File

@ -300,22 +300,10 @@ static int config(uint32_t width, uint32_t height, uint32_t d_width,
}
else
{
if ( vo_window == None )
{
vo_window = XCreateWindow(mDisplay, RootWindow(mDisplay, mScreen),
vo_dx, vo_dy, window_width, window_height, xswa.border_pixel,
vinfo.depth, InputOutput, vinfo.visual, xswamask, &xswa);
vo_x11_classhint(mDisplay, vo_window, "xvidix");
vo_hidecursor(mDisplay, vo_window);
vo_x11_sizehint( vo_dx,vo_dy,vo_dwidth,vo_dheight,0 );
XStoreName(mDisplay, vo_window, title);
XMapWindow(mDisplay, vo_window);
if ( flags&VOFLAG_FULLSCREEN ) vo_x11_fullscreen();
} else if ( !(flags&VOFLAG_FULLSCREEN) ) XMoveResizeWindow( mDisplay,vo_window,vo_dx,vo_dy,vo_dwidth,vo_dheight );
vo_x11_create_vo_window(&vinfo, vo_dx, vo_dy,
window_width, window_height, flags,
InputOutput, "xvidix", title);
XChangeWindowAttributes(mDisplay, vo_window, xswamask, &xswa);
}
if ( vo_gc != None ) XFreeGC( mDisplay,vo_gc );

View File

@ -301,48 +301,13 @@ static int config(uint32_t width, uint32_t height, uint32_t d_width,
if (vo_dheight <= 0) vo_dheight = d_height;
aspect_save_prescale(vo_dwidth, vo_dheight);
}
} else if (vo_window == None)
{
vo_window =
vo_x11_create_smooth_window(mDisplay, mRootWin,
vinfo.visual, hint.x, hint.y,
hint.width, hint.height, depth,
CopyFromParent);
XChangeWindowAttributes(mDisplay, vo_window, xswamask, &xswa);
vo_x11_classhint(mDisplay, vo_window, "xv");
vo_hidecursor(mDisplay, vo_window);
vo_x11_selectinput_witherr(mDisplay, vo_window,
StructureNotifyMask | KeyPressMask |
PropertyChangeMask | ((WinID == 0) ?
0
:
(PointerMotionMask
|
ButtonPressMask
|
ButtonReleaseMask
|
ExposureMask)));
XSetStandardProperties(mDisplay, vo_window, hello, hello, None,
NULL, 0, &hint);
vo_x11_sizehint(hint.x, hint.y, hint.width, hint.height, 0);
XMapWindow(mDisplay, vo_window);
vo_x11_nofs_sizepos(hint.x, hint.y, hint.width, hint.height);
if (flags & VOFLAG_FULLSCREEN)
vo_x11_fullscreen();
} else
{
// vo_fs set means we were already at fullscreen
vo_x11_sizehint(hint.x, hint.y, hint.width, hint.height, 0);
vo_x11_nofs_sizepos(hint.x, hint.y, hint.width, hint.height);
if (flags & VOFLAG_FULLSCREEN && !vo_fs)
vo_x11_fullscreen(); // handle -fs on non-first file
vo_x11_create_vo_window(&vinfo, vo_dx, vo_dy, d_width, d_height,
flags, CopyFromParent, "xv", title);
XChangeWindowAttributes(mDisplay, vo_window, xswamask, &xswa);
}
// vo_x11_sizehint( hint.x, hint.y, hint.width, hint.height,0 );
if (vo_gc != None)
XFreeGC(mDisplay, vo_gc);
vo_gc = XCreateGC(mDisplay, vo_window, 0L, &xgcv);

View File

@ -335,28 +335,10 @@ static int config(uint32_t width, uint32_t height, uint32_t d_width,
XSelectInput(mDisplay, vo_window, ExposureMask);
} else
{
if (vo_window == None)
{
vo_window =
XCreateWindow(mDisplay, RootWindow(mDisplay, mScreen),
vo_dx, vo_dy, window_width,
window_height, xswa.border_pixel,
vinfo.depth, InputOutput, vinfo.visual,
xswamask, &xswa);
vo_x11_classhint(mDisplay, vo_window, "xvidix");
vo_hidecursor(mDisplay, vo_window);
vo_x11_sizehint(vo_dx, vo_dy, vo_dwidth, vo_dheight, 0);
XStoreName(mDisplay, vo_window, title);
XMapWindow(mDisplay, vo_window);
vo_x11_nofs_sizepos(vo_dx, vo_dy, vo_dwidth, vo_dheight);
if (flags & VOFLAG_FULLSCREEN)
vo_x11_fullscreen();
} else
vo_x11_nofs_sizepos(vo_dx, vo_dy, vo_dwidth, vo_dheight);
vo_x11_create_vo_window(&vinfo, vo_dx, vo_dy,
window_width, window_height, flags,
CopyFromParent, "xvidix", title);
XChangeWindowAttributes(mDisplay, vo_window, xswamask, &xswa);
}
if (vo_gc != None)

View File

@ -695,33 +695,9 @@ skip_surface_allocation:
aspect_save_prescale(vo_dwidth, vo_dheight);
}
} else
if ( vo_window == None ){
vo_window = XCreateWindow(mDisplay, mRootWin,
hint.x, hint.y, hint.width, hint.height,
0, depth,CopyFromParent,vinfo.visual,xswamask,&xswa);
vo_x11_classhint( mDisplay,vo_window,"xvmc" );
vo_hidecursor(mDisplay,vo_window);
vo_x11_selectinput_witherr(mDisplay, vo_window, StructureNotifyMask | KeyPressMask | PropertyChangeMask | ExposureMask |
((WinID==0) ? 0 : (PointerMotionMask
| ButtonPressMask | ButtonReleaseMask)) );
XSetStandardProperties(mDisplay, vo_window, hello, hello, None, NULL, 0, &hint);
XSetWMNormalHints( mDisplay,vo_window,&hint );
XMapWindow(mDisplay, vo_window);
vo_x11_nofs_sizepos(hint.x, hint.y, hint.width, hint.height);
if ( flags&VOFLAG_FULLSCREEN ) vo_x11_fullscreen();
else {
vo_x11_sizehint( hint.x, hint.y, hint.width, hint.height,0 );
}
} else {
// vo_fs set means we were already at fullscreen
vo_x11_sizehint( hint.x, hint.y, hint.width, hint.height,0 );
vo_x11_nofs_sizepos(hint.x, hint.y, hint.width, hint.height);
if ( flags&VOFLAG_FULLSCREEN && !vo_fs ) vo_x11_fullscreen(); // handle -fs on non-first file
}
// vo_x11_sizehint( hint.x, hint.y, hint.width, hint.height,0 );
vo_x11_create_vo_window(&vinfo, vo_dx, vo_dy, d_width, d_height, flags,
CopyFromParent, "xvmc", title);
XChangeWindowAttributes(mDisplay, vo_window, xswamask, &xswa);
if ( vo_gc != None ) XFreeGC( mDisplay,vo_gc );
vo_gc = XCreateGC(mDisplay, vo_window, GCForeground, &xgcv);

View File

@ -1265,6 +1265,62 @@ Window vo_x11_create_smooth_window(Display * mDisplay, Window mRoot,
return ret_win;
}
/**
* \brief create and setup a window suitable for display
* \param vis Visual to use for creating the window
* \param x x position of window
* \param y y position of window
* \param width width of window
* \param height height of window
* \param flags flags for window creation.
* Only VOFLAG_FULLSCREEN is supported so far.
* \param col_map Colourmap for window
* \param classname name to use for the classhint
* \param title title for the window
*
* This also does the grunt-work like setting Window Manager hints etc.
* If vo_window is already set it just moves and resizes it.
*/
void vo_x11_create_vo_window(XVisualInfo *vis, int x, int y,
unsigned int width, unsigned int height, int flags,
Colormap col_map,
const char *classname, const char *title)
{
if (vo_window == None) {
XSizeHints hint;
XEvent xev;
vo_fs = 0;
vo_dwidth = width;
vo_dheight = height;
vo_window = vo_x11_create_smooth_window(mDisplay, mRootWin, vis->visual,
x, y, width, height, vis->depth, col_map);
vo_x11_classhint(mDisplay, vo_window, classname);
XStoreName(mDisplay, vo_window, title);
vo_hidecursor(mDisplay, vo_window);
XSelectInput(mDisplay, vo_window, StructureNotifyMask);
hint.x = x; hint.y = y;
hint.width = width; hint.height = height;
hint.flags = PPosition | PSize;
XSetStandardProperties(mDisplay, vo_window, title, title, None, NULL, 0, &hint);
vo_x11_sizehint(x, y, width, height, 0);
// map window
XMapWindow(mDisplay, vo_window);
XClearWindow(mDisplay, vo_window);
// wait for map
do {
XNextEvent(mDisplay, &xev);
} while (xev.type != MapNotify || xev.xmap.event != vo_window);
XSelectInput(mDisplay, vo_window, NoEventMask);
XSync(mDisplay, False);
vo_x11_selectinput_witherr(mDisplay, vo_window,
StructureNotifyMask | KeyPressMask | PointerMotionMask |
ButtonPressMask | ButtonReleaseMask | ExposureMask);
}
if (vo_ontop) vo_x11_setlayer(mDisplay, vo_window, vo_ontop);
vo_x11_nofs_sizepos(vo_dx, vo_dy, width, height);
if (!!vo_fs != !!(flags & VOFLAG_FULLSCREEN))
vo_x11_fullscreen();
}
void vo_x11_clearwindow_part(Display * mDisplay, Window vo_window,
int img_width, int img_height, int use_fs)

View File

@ -55,6 +55,9 @@ extern void fstype_help(void);
extern Window vo_x11_create_smooth_window( Display *mDisplay, Window mRoot,
Visual *vis, int x, int y, unsigned int width, unsigned int height,
int depth, Colormap col_map);
extern void vo_x11_create_vo_window(XVisualInfo *vis, int x, int y,
unsigned int width, unsigned int height, int flags,
Colormap col_map, const char *classname, const char *title);
extern void vo_x11_clearwindow_part(Display *mDisplay, Window vo_window,
int img_width, int img_height, int use_fs);
extern void vo_x11_clearwindow( Display *mDisplay, Window vo_window );