[Mplayer-cvslog] CVS: main/libvo vo_dga.c, 1.68, 1.69 vo_x11.c, 1.137, 1.138 vo_xmga.c, 1.86, 1.87 vo_xv.c, 1.151, 1.152 vo_xvidix.c, 1.66, 1.67 x11_common.c, 1.172, 1.173
Attila Kinali CVS
syncmail at mplayerhq.hu
Mon Jun 14 06:53:05 CEST 2004
- Previous message: [Mplayer-cvslog] CVS: main/libvo vo_dga.c, 1.68, 1.69 vo_x11.c, 1.137, 1.138 vo_xmga.c, 1.86, 1.87 vo_xv.c, 1.151, 1.152 vo_xvidix.c, 1.66, 1.67 x11_common.c, 1.172, 1.173
- Next message: [Mplayer-cvslog] CVS: main configure,1.869,1.870
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
CVS change done by Attila Kinali CVS
Update of /cvsroot/mplayer/main/libvo
In directory mail:/var2/tmp/cvs-serv27159
Modified Files:
vo_dga.c vo_x11.c vo_xmga.c vo_xv.c vo_xvidix.c x11_common.c
Log Message:
major reindentation of x11 code try #2
note that this is plain ident output, i didnt tweak it by
hand like the last attempt.
if anyone is interested in the indent profile i used, just drop me a mail.
please contact me on irc on how to send me my share of cola,
but be aware that i will only accept swiss or german cola, as the japanese is
way to sweet :)
Index: vo_dga.c
===================================================================
RCS file: /cvsroot/mplayer/main/libvo/vo_dga.c,v
retrieving revision 1.68
retrieving revision 1.69
diff -u -r1.68 -r1.69
--- vo_dga.c 19 Oct 2003 21:13:39 -0000 1.68
+++ vo_dga.c 14 Jun 2004 04:53:02 -0000 1.69
@@ -30,168 +30,181 @@
#include <X11/extensions/xf86vmode.h>
#endif
-static vo_info_t info =
-{
+static vo_info_t info = {
#ifdef HAVE_DGA2
- "DGA ( Direct Graphic Access V2.0 )",
+ "DGA ( Direct Graphic Access V2.0 )",
#else
#ifdef HAVE_XF86VM
- "DGA ( Direct Graphic Access V1.0+XF86VidModeExt. )",
+ "DGA ( Direct Graphic Access V1.0+XF86VidModeExt. )",
#else
- "DGA ( Direct Graphic Access V1.0 )",
+ "DGA ( Direct Graphic Access V1.0 )",
#endif
#endif
- "dga",
- "Andreas Ackermann <acki at acki-netz.de>",
- ""
+ "dga",
+ "Andreas Ackermann <acki at acki-netz.de>",
+ ""
};
-LIBVO_EXTERN( dga )
-
-
+LIBVO_EXTERN(dga)
//------------------------------------------------------------------
-
-
//#define BITSPP (vo_dga_modes[vo_dga_active_mode].vdm_bitspp)
//#define BYTESPP (vo_dga_modes[vo_dga_active_mode].vdm_bytespp)
-
#define VO_DGA_INVALID_RES 100000
-
#define HW_MODE (vo_dga_modes[vo_dga_hw_mode])
-#define SRC_MODE (vo_dga_modes[vo_dga_src_mode])
-
-struct vd_modes {
- int vdm_mplayer_depth;
- int vdm_supported;
- int vdm_depth;
- int vdm_bitspp;
- int vdm_bytespp;
- int vdm_rmask;
- int vdm_gmask;
- int vdm_bmask;
- int vdm_hw_mode;
+#define SRC_MODE (vo_dga_modes[vo_dga_src_mode])
+struct vd_modes
+{
+ int vdm_mplayer_depth;
+ int vdm_supported;
+ int vdm_depth;
+ int vdm_bitspp;
+ int vdm_bytespp;
+ int vdm_rmask;
+ int vdm_gmask;
+ int vdm_bmask;
+ int vdm_hw_mode;
};
//------------------------------------------------------------------
static struct vd_modes vo_dga_modes[] = {
- // these entries describe HW modes
- // however, we use the same entries to tell mplayer what we support
- // so the last two values describe, which HW mode to use and which conversion
- // function to use for a mode that is not supported by HW
-
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, },
- { 15, 0, 15, 16, 2, 0x7c00, 0x03e0, 0x001f, 2, },
- { 16, 0, 16, 16, 2, 0xf800, 0x07e0, 0x001f, 2, },
- { 24, 0, 24, 24, 3, 0xff0000, 0x00ff00, 0x0000ff, 4},
- { 32, 0, 24, 32, 4, 0x00ff0000, 0x0000ff00, 0x000000ff, 4}
+ // these entries describe HW modes
+ // however, we use the same entries to tell mplayer what we support
+ // so the last two values describe, which HW mode to use and which conversion
+ // function to use for a mode that is not supported by HW
+
+ {0, 0, 0, 0, 0, 0, 0, 0, 0,},
+ {15, 0, 15, 16, 2, 0x7c00, 0x03e0, 0x001f, 2,},
+ {16, 0, 16, 16, 2, 0xf800, 0x07e0, 0x001f, 2,},
+ {24, 0, 24, 24, 3, 0xff0000, 0x00ff00, 0x0000ff, 4},
+ {32, 0, 24, 32, 4, 0x00ff0000, 0x0000ff00, 0x000000ff, 4}
};
-static int vo_dga_mode_num = sizeof(vo_dga_modes)/sizeof(struct vd_modes);
+static int vo_dga_mode_num =
+ sizeof(vo_dga_modes) / sizeof(struct vd_modes);
// enable a HW mode (by description)
-static int vd_EnableMode( int depth, int bitspp,
- int rmask, int gmask, int bmask){
- int i;
- for(i=1; i<vo_dga_mode_num; i++){
- if(vo_dga_modes[i].vdm_depth == depth &&
- vo_dga_modes[i].vdm_bitspp == bitspp &&
- vo_dga_modes[i].vdm_rmask == rmask &&
- vo_dga_modes[i].vdm_gmask == gmask &&
- vo_dga_modes[i].vdm_bmask == bmask){
- vo_dga_modes[i].vdm_supported = 1;
- vo_dga_modes[i].vdm_hw_mode = i;
- return i;
- }
- }
- return 0;
-}
-
-static int vd_ModeEqual(int depth, int bitspp,
- int rmask, int gmask, int bmask, int index){
- return (
- (vo_dga_modes[index].vdm_depth == depth &&
- vo_dga_modes[index].vdm_bitspp == bitspp &&
- vo_dga_modes[index].vdm_rmask == rmask &&
- vo_dga_modes[index].vdm_gmask == gmask &&
- vo_dga_modes[index].vdm_bmask == bmask)
- ? 1 : 0);
+static int vd_EnableMode(int depth, int bitspp,
+ int rmask, int gmask, int bmask)
+{
+ int i;
+
+ for (i = 1; i < vo_dga_mode_num; i++)
+ {
+ if (vo_dga_modes[i].vdm_depth == depth &&
+ vo_dga_modes[i].vdm_bitspp == bitspp &&
+ vo_dga_modes[i].vdm_rmask == rmask &&
+ vo_dga_modes[i].vdm_gmask == gmask &&
+ vo_dga_modes[i].vdm_bmask == bmask)
+ {
+ vo_dga_modes[i].vdm_supported = 1;
+ vo_dga_modes[i].vdm_hw_mode = i;
+ return i;
+ }
+ }
+ return 0;
+}
+
+static int vd_ModeEqual(int depth, int bitspp,
+ int rmask, int gmask, int bmask, int index)
+{
+ return ((vo_dga_modes[index].vdm_depth == depth &&
+ vo_dga_modes[index].vdm_bitspp == bitspp &&
+ vo_dga_modes[index].vdm_rmask == rmask &&
+ vo_dga_modes[index].vdm_gmask == gmask &&
+ vo_dga_modes[index].vdm_bmask == bmask) ? 1 : 0);
}
// enable a HW mode (mplayer_depth decides which)
-static int vd_ValidateMode( int mplayer_depth){
- int i;
- if(mplayer_depth == 0)return 0;
- for(i=1; i<vo_dga_mode_num; i++){
- if(vo_dga_modes[i].vdm_mplayer_depth == mplayer_depth ){
- vo_dga_modes[i].vdm_supported = 1;
- vo_dga_modes[i].vdm_hw_mode = i;
- return i;
+static int vd_ValidateMode(int mplayer_depth)
+{
+ int i;
+
+ if (mplayer_depth == 0)
+ return 0;
+ for (i = 1; i < vo_dga_mode_num; i++)
+ {
+ if (vo_dga_modes[i].vdm_mplayer_depth == mplayer_depth)
+ {
+ vo_dga_modes[i].vdm_supported = 1;
+ vo_dga_modes[i].vdm_hw_mode = i;
+ return i;
+ }
}
- }
- return 0;
+ return 0;
}
// do we support this mode? (not important whether native or conversion)
-static int vd_ModeValid( int mplayer_depth){
- int i;
- if(mplayer_depth == 0)return 0;
- for(i=1; i<vo_dga_mode_num; i++){
- if(vo_dga_modes[i].vdm_mplayer_depth == mplayer_depth &&
- vo_dga_modes[i].vdm_supported != 0){
- return i;
+static int vd_ModeValid(int mplayer_depth)
+{
+ int i;
+
+ if (mplayer_depth == 0)
+ return 0;
+ for (i = 1; i < vo_dga_mode_num; i++)
+ {
+ if (vo_dga_modes[i].vdm_mplayer_depth == mplayer_depth &&
+ vo_dga_modes[i].vdm_supported != 0)
+ {
+ return i;
+ }
}
- }
- return 0;
+ return 0;
}
-static char *vd_GetModeString(int index){
+static char *vd_GetModeString(int index)
+{
#define VO_DGA_MAX_STRING_LEN 100
- static char stringbuf[VO_DGA_MAX_STRING_LEN];
- stringbuf[VO_DGA_MAX_STRING_LEN-1]=0;
- snprintf(stringbuf, VO_DGA_MAX_STRING_LEN-2,
- "depth=%d, bpp=%d, r=%06x, g=%06x, b=%06x, %s (-bpp %d)",
- vo_dga_modes[index].vdm_depth,
- vo_dga_modes[index].vdm_bitspp,
- vo_dga_modes[index].vdm_rmask,
- vo_dga_modes[index].vdm_gmask,
- vo_dga_modes[index].vdm_bmask,
- vo_dga_modes[index].vdm_supported ? "native" : "not supported",
- vo_dga_modes[index].vdm_mplayer_depth);
- return stringbuf;
+ static char stringbuf[VO_DGA_MAX_STRING_LEN];
+
+ stringbuf[VO_DGA_MAX_STRING_LEN - 1] = 0;
+ snprintf(stringbuf, VO_DGA_MAX_STRING_LEN - 2,
+ "depth=%d, bpp=%d, r=%06x, g=%06x, b=%06x, %s (-bpp %d)",
+ vo_dga_modes[index].vdm_depth,
+ vo_dga_modes[index].vdm_bitspp,
+ vo_dga_modes[index].vdm_rmask,
+ vo_dga_modes[index].vdm_gmask,
+ vo_dga_modes[index].vdm_bmask,
+ vo_dga_modes[index].
+ vdm_supported ? "native" : "not supported",
+ vo_dga_modes[index].vdm_mplayer_depth);
+ return stringbuf;
}
//-----------------------------------------------------------------
#if defined(HAVE_XF86VM) && !defined(HAVE_DGA2)
-static XF86VidModeModeInfo **vo_dga_vidmodes=NULL;
+static XF86VidModeModeInfo **vo_dga_vidmodes = NULL;
#endif
-static int vo_dga_src_format;
-static int vo_dga_width; // bytes per line in framebuffer
-static int vo_dga_vp_width; // visible pixels per line in
+static int vo_dga_src_format;
+static int vo_dga_width; // bytes per line in framebuffer
+static int vo_dga_vp_width; // visible pixels per line in
+
// framebuffer
-static int vo_dga_vp_height; // visible lines in framebuffer
-static int vo_dga_is_running = 0;
-static int vo_dga_src_width; // width of video in pixels
-static int vo_dga_src_height; // height of video in pixels
-static int vo_dga_src_offset=0; // offset in src
-static int vo_dga_vp_offset=0; // offset in dest
-static int vo_dga_bytes_per_line; // bytes per line to copy
-static int vo_dga_vp_skip; // dto. for dest
-static int vo_dga_lines; // num of lines to copy
-static int vo_dga_hw_mode = 0; // index in mode list that is actually
+static int vo_dga_vp_height; // visible lines in framebuffer
+static int vo_dga_is_running = 0;
+static int vo_dga_src_width; // width of video in pixels
+static int vo_dga_src_height; // height of video in pixels
+static int vo_dga_src_offset = 0; // offset in src
+static int vo_dga_vp_offset = 0; // offset in dest
+static int vo_dga_bytes_per_line; // bytes per line to copy
+static int vo_dga_vp_skip; // dto. for dest
+static int vo_dga_lines; // num of lines to copy
+static int vo_dga_hw_mode = 0; // index in mode list that is actually
+
// used by framebuffer
-static int vo_dga_src_mode = 0; // index in mode list that is used by
+static int vo_dga_src_mode = 0; // index in mode list that is used by
+
// codec
-static int vo_dga_XServer_mode = 0;// index in mode list for resolution
+static int vo_dga_XServer_mode = 0; // index in mode list for resolution
#ifdef HAVE_DGA2
- static XDGAMode * vo_modelines;
- static int vo_modecount;
+static XDGAMode *vo_modelines;
+static int vo_modecount;
#endif
#define MAX_NR_VIDEO_BUFFERS 3
@@ -199,48 +212,53 @@
#define CURRENT_VIDEO_BUFFER \
(vo_dga_video_buffer[vo_dga_current_video_buffer])
-static int vo_dga_nr_video_buffers; // Total number of frame buffers.
-static int vo_dga_current_video_buffer; // Buffer available for rendering.
+static int vo_dga_nr_video_buffers; // Total number of frame buffers.
+static int vo_dga_current_video_buffer; // Buffer available for rendering.
static struct video_buffer
{
- int y;
- uint8_t *data;
+ int y;
+ uint8_t *data;
} vo_dga_video_buffer[MAX_NR_VIDEO_BUFFERS];
/* saved src and dst dimensions for SwScaler */
static unsigned int scale_srcW = 0,
- scale_dstW = 0,
- scale_srcH = 0,
- scale_dstH = 0;
+ scale_dstW = 0, scale_srcH = 0, scale_dstH = 0;
//---------------------------------------------------------
-static void draw_alpha( int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride ){
+static void draw_alpha(int x0, int y0, int w, int h, unsigned char *src,
+ unsigned char *srca, int stride)
+{
+
+ char *d;
+ unsigned int offset;
+ unsigned int buffer_stride;
- char *d;
- unsigned int offset;
- unsigned int buffer_stride;
-
- offset = vo_dga_width * y0 +x0;
- buffer_stride = vo_dga_width;
- d = CURRENT_VIDEO_BUFFER.data + vo_dga_vp_offset;
-
- switch( HW_MODE.vdm_mplayer_depth ){
-
- case 32:
- vo_draw_alpha_rgb32(w,h,src,srca,stride, d+4*offset , 4*buffer_stride);
- break;
- case 24:
- vo_draw_alpha_rgb24(w,h,src,srca,stride, d+3*offset , 3*buffer_stride);
- break;
- case 15:
- vo_draw_alpha_rgb15(w,h,src,srca,stride, d+2*offset , 2*buffer_stride);
- break;
- case 16:
- vo_draw_alpha_rgb16(w,h,src,srca,stride, d+2*offset , 2*buffer_stride);
- break;
- }
+ offset = vo_dga_width * y0 + x0;
+ buffer_stride = vo_dga_width;
+ d = CURRENT_VIDEO_BUFFER.data + vo_dga_vp_offset;
+
+ switch (HW_MODE.vdm_mplayer_depth)
+ {
+
+ case 32:
+ vo_draw_alpha_rgb32(w, h, src, srca, stride, d + 4 * offset,
+ 4 * buffer_stride);
+ break;
+ case 24:
+ vo_draw_alpha_rgb24(w, h, src, srca, stride, d + 3 * offset,
+ 3 * buffer_stride);
+ break;
+ case 15:
+ vo_draw_alpha_rgb15(w, h, src, srca, stride, d + 2 * offset,
+ 2 * buffer_stride);
+ break;
+ case 16:
+ vo_draw_alpha_rgb16(w, h, src, srca, stride, d + 2 * offset,
+ 2 * buffer_stride);
+ break;
+ }
}
@@ -251,53 +269,56 @@
// quick & dirty - for debugging only
#if 0
-static void fillblock(char *strt, int yoff, int lines, int val){
- char *i;
- for(i = strt + yoff * vo_dga_width *HW_MODE.vdm_bytespp;
- i< strt + (lines+yoff) * vo_dga_width *HW_MODE.vdm_bytespp; ){
- *i++ = val;
- }
+static void fillblock(char *strt, int yoff, int lines, int val)
+{
+ char *i;
+
+ for (i = strt + yoff * vo_dga_width * HW_MODE.vdm_bytespp;
+ i < strt + (lines + yoff) * vo_dga_width * HW_MODE.vdm_bytespp;)
+ {
+ *i++ = val;
+ }
}
#endif
//---------------------------------------------------------
-static uint32_t draw_frame( uint8_t *src[] ){
+static uint32_t draw_frame(uint8_t * src[])
+{
+
+ int vp_skip = vo_dga_vp_skip;
+ int numlines = vo_dga_lines;
+
+ char *s, *d;
- int vp_skip = vo_dga_vp_skip;
- int numlines = vo_dga_lines;
+ s = *src;
+ d = CURRENT_VIDEO_BUFFER.data + vo_dga_vp_offset;
- char *s, *d;
+ mem2agpcpy_pic(d, s,
+ vo_dga_bytes_per_line,
+ numlines,
+ vo_dga_bytes_per_line + vo_dga_vp_skip,
+ vo_dga_bytes_per_line);
- s = *src;
- d = CURRENT_VIDEO_BUFFER.data + vo_dga_vp_offset;
-
- mem2agpcpy_pic(
- d, s,
- vo_dga_bytes_per_line,
- numlines,
- vo_dga_bytes_per_line+vo_dga_vp_skip,
- vo_dga_bytes_per_line);
-
- // DBG-COde
+ // DBG-COde
#if 0
- d = CURRENT_VIDEO_BUFFER.data + vo_dga_vp_offset;
- fillblock(d, 0, 10, 0x800000ff);
- fillblock(d, 10, 10, 0x8000ff00);
- fillblock(d, 20, 10, 0x80ff0000);
- fillblock(d, 30, 10, 0xff0000ff);
- fillblock(d, 40, 10, 0x800000ff);
- fillblock(d, 50, 10, 0x0f0000ff);
+ d = CURRENT_VIDEO_BUFFER.data + vo_dga_vp_offset;
+ fillblock(d, 0, 10, 0x800000ff);
+ fillblock(d, 10, 10, 0x8000ff00);
+ fillblock(d, 20, 10, 0x80ff0000);
+ fillblock(d, 30, 10, 0xff0000ff);
+ fillblock(d, 40, 10, 0x800000ff);
+ fillblock(d, 50, 10, 0x0f0000ff);
#endif
- return 0;
+ return 0;
}
//---------------------------------------------------------
static void check_events(void)
{
- vo_x11_check_events(mDisplay);
+ vo_x11_check_events(mDisplay);
}
//---------------------------------------------------------
@@ -305,96 +326,100 @@
#include "sub.h"
static void draw_osd(void)
-{ vo_draw_text(vo_dga_src_width,vo_dga_src_height,draw_alpha); }
+{
+ vo_draw_text(vo_dga_src_width, vo_dga_src_height, draw_alpha);
+}
static void switch_video_buffers(void)
{
- vo_dga_current_video_buffer =
- (vo_dga_current_video_buffer + 1) % vo_dga_nr_video_buffers;
+ vo_dga_current_video_buffer =
+ (vo_dga_current_video_buffer + 1) % vo_dga_nr_video_buffers;
}
-static void flip_page( void )
+static void flip_page(void)
{
- if(1 < vo_dga_nr_video_buffers)
- {
+ if (1 < vo_dga_nr_video_buffers)
+ {
#ifdef HAVE_DGA2
- XDGASetViewport(mDisplay, mScreen,
- 0,
- CURRENT_VIDEO_BUFFER.y,
- XDGAFlipRetrace);
+ XDGASetViewport(mDisplay, mScreen,
+ 0, CURRENT_VIDEO_BUFFER.y, XDGAFlipRetrace);
#else
- XF86DGASetViewPort(mDisplay, mScreen,
- 0,
- CURRENT_VIDEO_BUFFER.y);
+ XF86DGASetViewPort(mDisplay, mScreen, 0, CURRENT_VIDEO_BUFFER.y);
#endif
- switch_video_buffers();
- }
+ switch_video_buffers();
+ }
}
//---------------------------------------------------------
-static uint32_t draw_slice( uint8_t *src[],int stride[],
- int w,int h,int x,int y )
+static uint32_t draw_slice(uint8_t * src[], int stride[],
+ int w, int h, int x, int y)
{
- return 0;
+ return 0;
};
//---------------------------------------------------------
-static uint32_t query_format( uint32_t format )
+static uint32_t query_format(uint32_t format)
{
- if( (format&IMGFMT_BGR_MASK) == IMGFMT_BGR &&
- vd_ModeValid(format&0xff))
- {
- return VFCAP_CSP_SUPPORTED|VFCAP_CSP_SUPPORTED_BY_HW|VFCAP_OSD;
- }
-
- return 0;
+ if ((format & IMGFMT_BGR_MASK) == IMGFMT_BGR &&
+ vd_ModeValid(format & 0xff))
+ {
+ return VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_OSD;
+ }
+
+ return 0;
}
//---------------------------------------------------------
-static void
-uninit(void)
+static void uninit(void)
{
#ifdef HAVE_DGA2
- XDGADevice *dgadevice;
+ XDGADevice *dgadevice;
#endif
- if ( !vo_config_count ) return;
+ if (!vo_config_count)
+ return;
- if(vo_dga_is_running){
- vo_dga_is_running = 0;
- mp_msg(MSGT_VO, MSGL_V, "vo_dga: in uninit\n");
- if(vo_grabpointer)
- XUngrabPointer (mDisplay, CurrentTime);
- XUngrabKeyboard (mDisplay, CurrentTime);
+ if (vo_dga_is_running)
+ {
+ vo_dga_is_running = 0;
+ mp_msg(MSGT_VO, MSGL_V, "vo_dga: in uninit\n");
+ if (vo_grabpointer)
+ XUngrabPointer(mDisplay, CurrentTime);
+ XUngrabKeyboard(mDisplay, CurrentTime);
#ifdef HAVE_DGA2
- XDGACloseFramebuffer(mDisplay, mScreen);
- dgadevice = XDGASetMode(mDisplay, mScreen, 0);
- if(dgadevice != NULL){
- XFree(dgadevice);
- }
+ XDGACloseFramebuffer(mDisplay, mScreen);
+ dgadevice = XDGASetMode(mDisplay, mScreen, 0);
+ if (dgadevice != NULL)
+ {
+ XFree(dgadevice);
+ }
#else
- XF86DGADirectVideo (mDisplay, mScreen, 0);
- // first disable DirectVideo and then switch mode back!
+ XF86DGADirectVideo(mDisplay, mScreen, 0);
+ // first disable DirectVideo and then switch mode back!
#ifdef HAVE_XF86VM
- if (vo_dga_vidmodes != NULL ){
- int screen; screen=XDefaultScreen( mDisplay );
- mp_msg(MSGT_VO, MSGL_V, "vo_dga: VidModeExt: Switching back..\n");
- // seems some graphics adaptors need this more than once ...
- XF86VidModeSwitchToMode(mDisplay,screen,vo_dga_vidmodes[0]);
- XF86VidModeSwitchToMode(mDisplay,screen,vo_dga_vidmodes[0]);
- XF86VidModeSwitchToMode(mDisplay,screen,vo_dga_vidmodes[0]);
- XF86VidModeSwitchToMode(mDisplay,screen,vo_dga_vidmodes[0]);
- XFree(vo_dga_vidmodes);
- }
+ if (vo_dga_vidmodes != NULL)
+ {
+ int screen;
+
+ screen = XDefaultScreen(mDisplay);
+ mp_msg(MSGT_VO, MSGL_V,
+ "vo_dga: VidModeExt: Switching back..\n");
+ // seems some graphics adaptors need this more than once ...
+ XF86VidModeSwitchToMode(mDisplay, screen, vo_dga_vidmodes[0]);
+ XF86VidModeSwitchToMode(mDisplay, screen, vo_dga_vidmodes[0]);
+ XF86VidModeSwitchToMode(mDisplay, screen, vo_dga_vidmodes[0]);
+ XF86VidModeSwitchToMode(mDisplay, screen, vo_dga_vidmodes[0]);
+ XFree(vo_dga_vidmodes);
+ }
#endif
#endif
- }
- vo_x11_uninit();
+ }
+ vo_x11_uninit();
}
@@ -402,75 +427,57 @@
// TODO: check for larger maxy value
// (useful for double buffering!!!)
-static int check_res( int num, int x, int y, int bpp,
- int new_x, int new_y, int new_vbi, int new_maxy,
- int *old_x, int *old_y, int *old_vbi, int *old_maxy){
-
- mp_msg(MSGT_VO, MSGL_V, "vo_dga: (%3d) Trying %4d x %4d @ %3d Hz @ depth %2d ..",
- num, new_x, new_y, new_vbi, bpp );
- mp_msg(MSGT_VO, MSGL_V, "(old: %dx%d@%d).", *old_x, *old_y, *old_vbi);
- if (
- (new_x >= x) &&
- (new_y >= y) &&
- (
- // prefer a better resolution either in X or in Y
- // as long as the other dimension is at least the same
- //
- // hmm ... MAYBE it would be more clever to focus on the
- // x-resolution; I had 712x400 and 640x480 and the movie
- // was 640x360; 640x480 would be the 'right thing' here
- // but since 712x400 was queried first I got this one.
- // I think there should be a cmd-line switch to let the
- // user choose the mode he likes ... (acki2)
-
- (
- ((new_x < *old_x) &&
- !(new_y > *old_y)) ||
- ((new_y < *old_y) &&
- !(new_x > *old_x))
- )
- // but if we get an identical resolution choose
- // the one with the lower refreshrate (saves bandwidth !!!)
- // as long as it's above 50 Hz (acki2 on 30/3/2001)
- ||
- (
- (
- (new_x == *old_x) &&
- (new_y == *old_y) &&
- (
- (
- new_vbi >= *old_vbi && *old_vbi < 50
- )
- ||
- (
- *old_vbi >= 50 &&
- new_vbi < *old_vbi &&
- new_vbi >= 50
- )
- )
- )
- ||
- // if everything is equal, then use the mode with the lower
- // stride
- (
- (new_x == *old_x) &&
- (new_y == *old_y) &&
- (new_vbi == *old_vbi) &&
- (new_maxy > *old_maxy)
- )
- )
- )
- )
- {
- *old_x = new_x;
- *old_y = new_y;
- *old_maxy = new_maxy;
- *old_vbi = new_vbi;
- mp_msg(MSGT_VO, MSGL_V, ".ok!!\n");
- return 1;
- }else{
- mp_msg(MSGT_VO, MSGL_V, ".no\n");
- return 0;
+static int check_res(int num, int x, int y, int bpp,
+ int new_x, int new_y, int new_vbi, int new_maxy,
+ int *old_x, int *old_y, int *old_vbi, int *old_maxy)
+{
+
+ mp_msg(MSGT_VO, MSGL_V,
+ "vo_dga: (%3d) Trying %4d x %4d @ %3d Hz @ depth %2d ..", num,
+ new_x, new_y, new_vbi, bpp);
+ mp_msg(MSGT_VO, MSGL_V, "(old: %dx%d@%d).", *old_x, *old_y, *old_vbi);
+ if ((new_x >= x) && (new_y >= y) && (
+ // prefer a better resolution either in X or in Y
+ // as long as the other dimension is at least the same
+ //
+ // hmm ... MAYBE it would be more clever to focus on the
+ // x-resolution; I had 712x400 and 640x480 and the movie
+ // was 640x360; 640x480 would be the 'right thing' here
+ // but since 712x400 was queried first I got this one.
+ // I think there should be a cmd-line switch to let the
+ // user choose the mode he likes ... (acki2)
+ (((new_x < *old_x) &&
+ !(new_y > *old_y)) ||
+ ((new_y < *old_y) &&
+ !(new_x > *old_x)))
+ // but if we get an identical resolution choose
+ // the one with the lower refreshrate (saves bandwidth !!!)
+ // as long as it's above 50 Hz (acki2 on 30/3/2001)
+ ||
+ (((new_x == *old_x) &&
+ (new_y == *old_y) &&
+ ((new_vbi >= *old_vbi
+ && *old_vbi < 50)
+ || (*old_vbi >= 50
+ && new_vbi < *old_vbi
+ && new_vbi >= 50))) ||
+ // if everything is equal, then use the mode with the lower
+ // stride
+ ((new_x == *old_x) &&
+ (new_y == *old_y) &&
+ (new_vbi == *old_vbi) &&
+ (new_maxy > *old_maxy)))))
+ {
+ *old_x = new_x;
+ *old_y = new_y;
+ *old_maxy = new_maxy;
+ *old_vbi = new_vbi;
+ mp_msg(MSGT_VO, MSGL_V, ".ok!!\n");
+ return 1;
+ } else
+ {
+ mp_msg(MSGT_VO, MSGL_V, ".no\n");
+ return 0;
}
}
@@ -478,460 +485,505 @@
//---------------------------------------------------------
-static void init_video_buffers(uint8_t *buffer_base,
- int view_port_height,
- int bytes_per_scanline,
- int max_view_port_y,
- int use_multiple_buffers)
-{
- int bytes_per_buffer = view_port_height * bytes_per_scanline;
- int i;
-
- if(use_multiple_buffers)
- vo_dga_nr_video_buffers = max_view_port_y / view_port_height;
- else
- vo_dga_nr_video_buffers = 1;
-
- if (vo_dga_nr_video_buffers > MAX_NR_VIDEO_BUFFERS)
- vo_dga_nr_video_buffers = MAX_NR_VIDEO_BUFFERS;
- if (vo_dga_nr_video_buffers <= 0)
- vo_dga_nr_video_buffers = 1;
-
- vo_dga_current_video_buffer = 0;
-
- for(i = 0; i < vo_dga_nr_video_buffers; i++)
- {
- vo_dga_video_buffer[i].y = i * view_port_height;
- vo_dga_video_buffer[i].data =
- buffer_base + i * bytes_per_buffer;
-
- // Clear video buffer.
- memset(vo_dga_video_buffer[i].data, 0, bytes_per_buffer);
- }
-}
-
-static uint32_t config( uint32_t width, uint32_t height,
- uint32_t d_width,uint32_t d_height,
- uint32_t flags,char *title,uint32_t format)
+static void init_video_buffers(uint8_t * buffer_base,
+ int view_port_height,
+ int bytes_per_scanline,
+ int max_view_port_y,
+ int use_multiple_buffers)
+{
+ int bytes_per_buffer = view_port_height * bytes_per_scanline;
+ int i;
+
+ if (use_multiple_buffers)
+ vo_dga_nr_video_buffers = max_view_port_y / view_port_height;
+ else
+ vo_dga_nr_video_buffers = 1;
+
+ if (vo_dga_nr_video_buffers > MAX_NR_VIDEO_BUFFERS)
+ vo_dga_nr_video_buffers = MAX_NR_VIDEO_BUFFERS;
+ if (vo_dga_nr_video_buffers <= 0)
+ vo_dga_nr_video_buffers = 1;
+
+ vo_dga_current_video_buffer = 0;
+
+ for (i = 0; i < vo_dga_nr_video_buffers; i++)
+ {
+ vo_dga_video_buffer[i].y = i * view_port_height;
+ vo_dga_video_buffer[i].data = buffer_base + i * bytes_per_buffer;
+
+ // Clear video buffer.
+ memset(vo_dga_video_buffer[i].data, 0, bytes_per_buffer);
+ }
+}
+
+static uint32_t config(uint32_t width, uint32_t height,
+ uint32_t d_width, uint32_t d_height,
+ uint32_t flags, char *title, uint32_t format)
{
- int x_off, y_off;
- int wanted_width, wanted_height;
+ int x_off, y_off;
+ int wanted_width, wanted_height;
+
+ static unsigned char *vo_dga_base;
+ static int prev_width, prev_height;
- static unsigned char *vo_dga_base;
- static int prev_width, prev_height;
#ifdef HAVE_DGA2
- // needed to change DGA video mode
- int mX=VO_DGA_INVALID_RES, mY=VO_DGA_INVALID_RES , mVBI=100000, mMaxY=0, i,j=0;
- int dga_modenum;
- XDGAMode *modeline;
- XDGADevice *dgadevice;
+ // needed to change DGA video mode
+ int mX = VO_DGA_INVALID_RES, mY = VO_DGA_INVALID_RES, mVBI =
+ 100000, mMaxY = 0, i, j = 0;
+ int dga_modenum;
+ XDGAMode *modeline;
+ XDGADevice *dgadevice;
#else
#ifdef HAVE_XF86VM
- unsigned int vm_event, vm_error;
- unsigned int vm_ver, vm_rev;
- int i, j=0, have_vm=0;
- int mX=VO_DGA_INVALID_RES, mY=VO_DGA_INVALID_RES, mVBI=100000, mMaxY=0, dga_modenum;
+ unsigned int vm_event, vm_error;
+ unsigned int vm_ver, vm_rev;
+ int i, j = 0, have_vm = 0;
+ int mX = VO_DGA_INVALID_RES, mY = VO_DGA_INVALID_RES, mVBI =
+ 100000, mMaxY = 0, dga_modenum;
#endif
- int bank, ram;
+ int bank, ram;
#endif
- vo_dga_src_format = format;
+ vo_dga_src_format = format;
- wanted_width = d_width;
- wanted_height = d_height;
+ wanted_width = d_width;
+ wanted_height = d_height;
- if(!wanted_height) wanted_height = height;
- if(!wanted_width) wanted_width = width;
+ if (!wanted_height)
+ wanted_height = height;
+ if (!wanted_width)
+ wanted_width = width;
- if( !vo_dbpp ){
- if((format & IMGFMT_BGR_MASK) == IMGFMT_BGR){
- vo_dga_src_mode = vd_ModeValid( format & 0xff );
+ if (!vo_dbpp)
+ {
+ if ((format & IMGFMT_BGR_MASK) == IMGFMT_BGR)
+ {
+ vo_dga_src_mode = vd_ModeValid(format & 0xff);
+ }
+ } else
+ {
+ vo_dga_src_mode = vd_ModeValid(vo_dbpp);
+ }
+ vo_dga_hw_mode = SRC_MODE.vdm_hw_mode;
+
+ if (!vo_dga_src_mode)
+ {
+ mp_msg(MSGT_VO, MSGL_ERR, "vo_dga: unsupported video format!\n");
+ return 1;
}
- }else{
- vo_dga_src_mode = vd_ModeValid(vo_dbpp);
- }
- vo_dga_hw_mode = SRC_MODE.vdm_hw_mode;
- if(!vo_dga_src_mode){
- mp_msg(MSGT_VO, MSGL_ERR, "vo_dga: unsupported video format!\n");
- return 1;
- }
-
- vo_dga_vp_width = vo_screenwidth;
- vo_dga_vp_height = vo_screenheight;
+ vo_dga_vp_width = vo_screenwidth;
+ vo_dga_vp_height = vo_screenheight;
- mp_msg(MSGT_VO, MSGL_V, "vo_dga: XServer res: %dx%d\n",
- vo_dga_vp_width, vo_dga_vp_height);
+ mp_msg(MSGT_VO, MSGL_V, "vo_dga: XServer res: %dx%d\n",
+ vo_dga_vp_width, vo_dga_vp_height);
// choose a suitable mode ...
-
+
#ifdef HAVE_DGA2
// Code to change the video mode added by Michael Graffam
// mgraffam at idsi.net
- mp_msg(MSGT_VO, MSGL_V, "vo_dga: vo_modelines=%p, vo_modecount=%d\n", vo_modelines, vo_modecount);
+ mp_msg(MSGT_VO, MSGL_V, "vo_dga: vo_modelines=%p, vo_modecount=%d\n",
+ vo_modelines, vo_modecount);
+
+ if (vo_modelines == NULL)
+ {
+ mp_msg(MSGT_VO, MSGL_ERR, "vo_dga: can't get modelines\n");
+ return 1;
+ }
- if (vo_modelines == NULL)
- {
- mp_msg(MSGT_VO, MSGL_ERR, "vo_dga: can't get modelines\n");
- return 1;
- }
-
- mp_msg(MSGT_VO, MSGL_INFO,
- "vo_dga: DGA 2.0 available :-) Can switch resolution AND depth!\n");
- for (i=0; i<vo_modecount; i++)
- {
- if(vd_ModeEqual( vo_modelines[i].depth,
- vo_modelines[i].bitsPerPixel,
- vo_modelines[i].redMask,
- vo_modelines[i].greenMask,
- vo_modelines[i].blueMask,
- vo_dga_hw_mode)){
-
- mp_msg(MSGT_VO, MSGL_V, "maxy: %4d, depth: %2d, %4dx%4d, ",
- vo_modelines[i].maxViewportY, vo_modelines[i].depth,
- vo_modelines[i].imageWidth, vo_modelines[i].imageHeight );
- if ( check_res(i, wanted_width, wanted_height, vo_modelines[i].depth,
- vo_modelines[i].viewportWidth,
- vo_modelines[i].viewportHeight,
- (unsigned) vo_modelines[i].verticalRefresh,
- vo_modelines[i].maxViewportY,
- &mX, &mY, &mVBI, &mMaxY )) j = i;
- }
- }
- mp_msg(MSGT_VO, MSGL_INFO,
- "vo_dga: Selected hardware mode %4d x %4d @ %3d Hz @ depth %2d, bitspp %2d.\n",
- mX, mY, mVBI,
- HW_MODE.vdm_depth,
- HW_MODE.vdm_bitspp);
- mp_msg(MSGT_VO, MSGL_INFO,
- "vo_dga: Video parameters by codec: %3d x %3d, depth %2d, bitspp %2d.\n",
- width, height,
- SRC_MODE.vdm_depth,
- SRC_MODE.vdm_bitspp);
- vo_dga_vp_width = mX;
- vo_dga_vp_height = mY;
-
- if((flags&0x04)||(flags&0x01)) { /* -zoom or -fs */
- scale_dstW = (d_width + 7) & ~7;
- scale_dstH = d_height;
- scale_srcW = width;
- scale_srcH = height;
- aspect_save_screenres(mX,mY);
- aspect_save_orig(scale_srcW,scale_srcH);
- aspect_save_prescale(scale_dstW,scale_dstH);
- if(flags&0x01) /* -fs */
- aspect(&scale_dstW,&scale_dstH,A_ZOOM);
- else if(flags&0x04) /* -fs */
- aspect(&scale_dstW,&scale_dstH,A_NOZOOM);
mp_msg(MSGT_VO, MSGL_INFO,
- "vo_dga: Aspect corrected size for SwScaler: %4d x %4d.\n",
- scale_dstW, scale_dstH);
- /* XXX this is a hack, but I'm lazy ;-) :: atmos */
- width = scale_dstW;
- height = scale_dstH;
- }
-
- vo_dga_width = vo_modelines[j].bytesPerScanline / HW_MODE.vdm_bytespp ;
- dga_modenum = vo_modelines[j].num;
- modeline = vo_modelines + j;
-
+ "vo_dga: DGA 2.0 available :-) Can switch resolution AND depth!\n");
+ for (i = 0; i < vo_modecount; i++)
+ {
+ if (vd_ModeEqual(vo_modelines[i].depth,
+ vo_modelines[i].bitsPerPixel,
+ vo_modelines[i].redMask,
+ vo_modelines[i].greenMask,
+ vo_modelines[i].blueMask, vo_dga_hw_mode))
+ {
+
+ mp_msg(MSGT_VO, MSGL_V, "maxy: %4d, depth: %2d, %4dx%4d, ",
+ vo_modelines[i].maxViewportY, vo_modelines[i].depth,
+ vo_modelines[i].imageWidth,
+ vo_modelines[i].imageHeight);
+ if (check_res
+ (i, wanted_width, wanted_height, vo_modelines[i].depth,
+ vo_modelines[i].viewportWidth,
+ vo_modelines[i].viewportHeight,
+ (unsigned) vo_modelines[i].verticalRefresh,
+ vo_modelines[i].maxViewportY, &mX, &mY, &mVBI, &mMaxY))
+ j = i;
+ }
+ }
+ mp_msg(MSGT_VO, MSGL_INFO,
+ "vo_dga: Selected hardware mode %4d x %4d @ %3d Hz @ depth %2d, bitspp %2d.\n",
+ mX, mY, mVBI, HW_MODE.vdm_depth, HW_MODE.vdm_bitspp);
+ mp_msg(MSGT_VO, MSGL_INFO,
+ "vo_dga: Video parameters by codec: %3d x %3d, depth %2d, bitspp %2d.\n",
+ width, height, SRC_MODE.vdm_depth, SRC_MODE.vdm_bitspp);
+ vo_dga_vp_width = mX;
+ vo_dga_vp_height = mY;
+
+ if ((flags & 0x04) || (flags & 0x01))
+ { /* -zoom or -fs */
+ scale_dstW = (d_width + 7) & ~7;
+ scale_dstH = d_height;
+ scale_srcW = width;
+ scale_srcH = height;
+ aspect_save_screenres(mX, mY);
+ aspect_save_orig(scale_srcW, scale_srcH);
+ aspect_save_prescale(scale_dstW, scale_dstH);
+ if (flags & 0x01) /* -fs */
+ aspect(&scale_dstW, &scale_dstH, A_ZOOM);
+ else if (flags & 0x04) /* -fs */
+ aspect(&scale_dstW, &scale_dstH, A_NOZOOM);
+ mp_msg(MSGT_VO, MSGL_INFO,
+ "vo_dga: Aspect corrected size for SwScaler: %4d x %4d.\n",
+ scale_dstW, scale_dstH);
+ /* XXX this is a hack, but I'm lazy ;-) :: atmos */
+ width = scale_dstW;
+ height = scale_dstH;
+ }
+
+ vo_dga_width = vo_modelines[j].bytesPerScanline / HW_MODE.vdm_bytespp;
+ dga_modenum = vo_modelines[j].num;
+ modeline = vo_modelines + j;
+
#else
#ifdef HAVE_XF86VM
- mp_msg(MSGT_VO, MSGL_INFO,
- "vo_dga: DGA 1.0 compatibility code: Using XF86VidMode for mode switching!\n");
+ mp_msg(MSGT_VO, MSGL_INFO,
+ "vo_dga: DGA 1.0 compatibility code: Using XF86VidMode for mode switching!\n");
- if (XF86VidModeQueryExtension(mDisplay, &vm_event, &vm_error)) {
- XF86VidModeQueryVersion(mDisplay, &vm_ver, &vm_rev);
- mp_msg(MSGT_VO, MSGL_INFO, "vo_dga: XF86VidMode Extension v%i.%i\n", vm_ver, vm_rev);
- have_vm=1;
- } else {
- mp_msg(MSGT_VO, MSGL_ERR, "vo_dga: XF86VidMode Extension not available.\n");
- }
+ if (XF86VidModeQueryExtension(mDisplay, &vm_event, &vm_error))
+ {
+ XF86VidModeQueryVersion(mDisplay, &vm_ver, &vm_rev);
+ mp_msg(MSGT_VO, MSGL_INFO,
+ "vo_dga: XF86VidMode Extension v%i.%i\n", vm_ver, vm_rev);
+ have_vm = 1;
+ } else
+ {
+ mp_msg(MSGT_VO, MSGL_ERR,
+ "vo_dga: XF86VidMode Extension not available.\n");
+ }
#define GET_VREFRESH(dotclk, x, y)( (((dotclk)/(x))*1000)/(y) )
-
- if (have_vm) {
- int modecount;
- XF86VidModeGetAllModeLines(mDisplay,mScreen,&modecount,&vo_dga_vidmodes);
-
- if(vo_dga_vidmodes != NULL ){
- for (i=0; i<modecount; i++){
- if ( check_res(i, wanted_width, wanted_height,
- vo_dga_modes[vo_dga_hw_mode].vdm_depth,
- vo_dga_vidmodes[i]->hdisplay,
- vo_dga_vidmodes[i]->vdisplay,
- GET_VREFRESH(vo_dga_vidmodes[i]->dotclock,
- vo_dga_vidmodes[i]->htotal,
- vo_dga_vidmodes[i]->vtotal),
- 0,
- &mX, &mY, &mVBI, &mMaxY )) j = i;
- }
-
- mp_msg(MSGT_VO, MSGL_INFO,
- "vo_dga: Selected video mode %4d x %4d @ %3d Hz @ depth %2d, bitspp %2d, video %3d x %3d.\n",
- mX, mY, mVBI,
- vo_dga_modes[vo_dga_hw_mode].vdm_depth,
- vo_dga_modes[vo_dga_hw_mode].vdm_bitspp,
- width, height);
- }else{
- mp_msg(MSGT_VO, MSGL_INFO, "vo_dga: XF86VidMode returned no screens - using current resolution.\n");
- }
- dga_modenum = j;
- vo_dga_vp_width = mX;
- vo_dga_vp_height = mY;
- }
+ if (have_vm)
+ {
+ int modecount;
+
+ XF86VidModeGetAllModeLines(mDisplay, mScreen, &modecount,
+ &vo_dga_vidmodes);
+
+ if (vo_dga_vidmodes != NULL)
+ {
+ for (i = 0; i < modecount; i++)
+ {
+ if (check_res(i, wanted_width, wanted_height,
+ vo_dga_modes[vo_dga_hw_mode].vdm_depth,
+ vo_dga_vidmodes[i]->hdisplay,
+ vo_dga_vidmodes[i]->vdisplay,
+ GET_VREFRESH(vo_dga_vidmodes[i]->dotclock,
+ vo_dga_vidmodes[i]->htotal,
+ vo_dga_vidmodes[i]->vtotal),
+ 0, &mX, &mY, &mVBI, &mMaxY))
+ j = i;
+ }
+
+ mp_msg(MSGT_VO, MSGL_INFO,
+ "vo_dga: Selected video mode %4d x %4d @ %3d Hz @ depth %2d, bitspp %2d, video %3d x %3d.\n",
+ mX, mY, mVBI,
+ vo_dga_modes[vo_dga_hw_mode].vdm_depth,
+ vo_dga_modes[vo_dga_hw_mode].vdm_bitspp, width, height);
+ } else
+ {
+ mp_msg(MSGT_VO, MSGL_INFO,
+ "vo_dga: XF86VidMode returned no screens - using current resolution.\n");
+ }
+ dga_modenum = j;
+ vo_dga_vp_width = mX;
+ vo_dga_vp_height = mY;
+ }
#else
- mp_msg(MSGT_VO, MSGL_INFO, "vo_dga: Only have DGA 1.0 extension and no XF86VidMode :-(\n");
- mp_msg(MSGT_VO, MSGL_INFO, " Thus, resolution switching is NOT possible.\n");
+ mp_msg(MSGT_VO, MSGL_INFO,
+ "vo_dga: Only have DGA 1.0 extension and no XF86VidMode :-(\n");
+ mp_msg(MSGT_VO, MSGL_INFO,
+ " Thus, resolution switching is NOT possible.\n");
#endif
#endif
- vo_dga_src_width = width;
- vo_dga_src_height = height;
-
- if(vo_dga_src_width > vo_dga_vp_width ||
- vo_dga_src_height > vo_dga_vp_height)
- {
- mp_msg(MSGT_VO, MSGL_ERR, "vo_dga: Sorry, video larger than viewport is not yet supported!\n");
- // ugly, do something nicer in the future ...
+ vo_dga_src_width = width;
+ vo_dga_src_height = height;
+
+ if (vo_dga_src_width > vo_dga_vp_width ||
+ vo_dga_src_height > vo_dga_vp_height)
+ {
+ mp_msg(MSGT_VO, MSGL_ERR,
+ "vo_dga: Sorry, video larger than viewport is not yet supported!\n");
+ // ugly, do something nicer in the future ...
#ifndef HAVE_DGA2
#ifdef HAVE_XF86VM
- if(vo_dga_vidmodes){
- XFree(vo_dga_vidmodes);
- vo_dga_vidmodes = NULL;
- }
+ if (vo_dga_vidmodes)
+ {
+ XFree(vo_dga_vidmodes);
+ vo_dga_vidmodes = NULL;
+ }
#endif
#endif
- return 1;
- }
-
- if(vo_dga_vp_width == VO_DGA_INVALID_RES){
- mp_msg(MSGT_VO, MSGL_ERR, "vo_dga: Something is wrong with your DGA. There doesn't seem to be a\n"
- " single suitable mode!\n"
- " Please file a bug report (see DOCS/HTML/en/bugreports.html)\n");
+ return 1;
+ }
+
+ if (vo_dga_vp_width == VO_DGA_INVALID_RES)
+ {
+ mp_msg(MSGT_VO, MSGL_ERR,
+ "vo_dga: Something is wrong with your DGA. There doesn't seem to be a\n"
+ " single suitable mode!\n"
+ " Please file a bug report (see DOCS/HTML/en/bugreports.html)\n");
#ifndef HAVE_DGA2
#ifdef HAVE_XF86VM
- if(vo_dga_vidmodes){
- XFree(vo_dga_vidmodes);
- vo_dga_vidmodes = NULL;
- }
+ if (vo_dga_vidmodes)
+ {
+ XFree(vo_dga_vidmodes);
+ vo_dga_vidmodes = NULL;
+ }
#endif
#endif
- return 1;
- }
-
+ return 1;
+ }
// now let's start the DGA thing
- if ( !vo_config_count || width != prev_width || height != prev_height )
- {
+ if (!vo_config_count || width != prev_width || height != prev_height)
+ {
#ifdef HAVE_DGA2
- if (!XDGAOpenFramebuffer(mDisplay, mScreen)){
- mp_msg(MSGT_VO, MSGL_ERR, "vo_dga: Framebuffer mapping failed!!!\n");
- return 1;
- }
+ if (!XDGAOpenFramebuffer(mDisplay, mScreen))
+ {
+ mp_msg(MSGT_VO, MSGL_ERR,
+ "vo_dga: Framebuffer mapping failed!!!\n");
+ return 1;
+ }
+
+ dgadevice = XDGASetMode(mDisplay, mScreen, dga_modenum);
+ XDGASync(mDisplay, mScreen);
- dgadevice=XDGASetMode(mDisplay, mScreen, dga_modenum);
- XDGASync(mDisplay, mScreen);
+ vo_dga_base = dgadevice->data;
+ XFree(dgadevice);
- vo_dga_base = dgadevice->data;
- XFree(dgadevice);
+ XDGASetViewport(mDisplay, mScreen, 0, 0, XDGAFlipRetrace);
- XDGASetViewport (mDisplay, mScreen, 0, 0, XDGAFlipRetrace);
-
#else
#ifdef HAVE_XF86VM
- if (have_vm)
- {
- XF86VidModeLockModeSwitch(mDisplay,mScreen,0);
- // Two calls are needed to switch modes on my ATI Rage 128. Why?
- // for riva128 one call is enough!
- XF86VidModeSwitchToMode(mDisplay,mScreen,vo_dga_vidmodes[dga_modenum]);
- XF86VidModeSwitchToMode(mDisplay,mScreen,vo_dga_vidmodes[dga_modenum]);
- }
-#endif
-
- XF86DGAGetViewPortSize(mDisplay,mScreen,
- &vo_dga_vp_width,
- &vo_dga_vp_height);
-
- XF86DGAGetVideo (mDisplay, mScreen,
- (char **)&vo_dga_base, &vo_dga_width, &bank, &ram);
-
- XF86DGADirectVideo (mDisplay, mScreen,
- XF86DGADirectGraphics | XF86DGADirectMouse |
- XF86DGADirectKeyb);
-
- XF86DGASetViewPort (mDisplay, mScreen, 0, 0);
-
-#endif
- }
-
- // do some more checkings here ...
-
- mp_msg(MSGT_VO, MSGL_V, "vo_dga: bytes/line: %d, screen res: %dx%d, depth: %d, base: %08x, bpp: %d\n",
- vo_dga_width, vo_dga_vp_width,
- vo_dga_vp_height, HW_MODE.vdm_bytespp, vo_dga_base,
- HW_MODE.vdm_bitspp);
-
- x_off = (vo_dga_vp_width - vo_dga_src_width)>>1;
- y_off = (vo_dga_vp_height - vo_dga_src_height)>>1;
-
- vo_dga_bytes_per_line = vo_dga_src_width * HW_MODE.vdm_bytespp;
- vo_dga_lines = vo_dga_src_height;
-
- vo_dga_src_offset = 0;
- vo_dga_vp_offset = (y_off * vo_dga_width + x_off ) * HW_MODE.vdm_bytespp;
-
- vo_dga_vp_skip = (vo_dga_width - vo_dga_src_width) * HW_MODE.vdm_bytespp; // todo
-
- mp_msg(MSGT_VO, MSGL_V, "vo_dga: vp_off=%d, vp_skip=%d, bpl=%d\n",
- vo_dga_vp_offset, vo_dga_vp_skip, vo_dga_bytes_per_line);
-
-
- XGrabKeyboard (mDisplay, DefaultRootWindow(mDisplay), True,
- GrabModeAsync,GrabModeAsync, CurrentTime);
- if(vo_grabpointer)
- XGrabPointer (mDisplay, DefaultRootWindow(mDisplay), True,
- ButtonPressMask,GrabModeAsync, GrabModeAsync,
- None, None, CurrentTime);
-
- if ( !vo_config_count || width != prev_width || height != prev_height )
- {
- init_video_buffers(vo_dga_base,
- vo_dga_vp_height,
- vo_dga_width * HW_MODE.vdm_bytespp,
+ if (have_vm)
+ {
+ XF86VidModeLockModeSwitch(mDisplay, mScreen, 0);
+ // Two calls are needed to switch modes on my ATI Rage 128. Why?
+ // for riva128 one call is enough!
+ XF86VidModeSwitchToMode(mDisplay, mScreen,
+ vo_dga_vidmodes[dga_modenum]);
+ XF86VidModeSwitchToMode(mDisplay, mScreen,
+ vo_dga_vidmodes[dga_modenum]);
+ }
+#endif
+
+ XF86DGAGetViewPortSize(mDisplay, mScreen,
+ &vo_dga_vp_width, &vo_dga_vp_height);
+
+ XF86DGAGetVideo(mDisplay, mScreen,
+ (char **) &vo_dga_base, &vo_dga_width, &bank,
+ &ram);
+
+ XF86DGADirectVideo(mDisplay, mScreen,
+ XF86DGADirectGraphics | XF86DGADirectMouse |
+ XF86DGADirectKeyb);
+
+ XF86DGASetViewPort(mDisplay, mScreen, 0, 0);
+
+#endif
+ }
+ // do some more checkings here ...
+
+ mp_msg(MSGT_VO, MSGL_V,
+ "vo_dga: bytes/line: %d, screen res: %dx%d, depth: %d, base: %08x, bpp: %d\n",
+ vo_dga_width, vo_dga_vp_width, vo_dga_vp_height,
+ HW_MODE.vdm_bytespp, vo_dga_base, HW_MODE.vdm_bitspp);
+
+ x_off = (vo_dga_vp_width - vo_dga_src_width) >> 1;
+ y_off = (vo_dga_vp_height - vo_dga_src_height) >> 1;
+
+ vo_dga_bytes_per_line = vo_dga_src_width * HW_MODE.vdm_bytespp;
+ vo_dga_lines = vo_dga_src_height;
+
+ vo_dga_src_offset = 0;
+ vo_dga_vp_offset =
+ (y_off * vo_dga_width + x_off) * HW_MODE.vdm_bytespp;
+
+ vo_dga_vp_skip = (vo_dga_width - vo_dga_src_width) * HW_MODE.vdm_bytespp; // todo
+
+ mp_msg(MSGT_VO, MSGL_V, "vo_dga: vp_off=%d, vp_skip=%d, bpl=%d\n",
+ vo_dga_vp_offset, vo_dga_vp_skip, vo_dga_bytes_per_line);
+
+
+ XGrabKeyboard(mDisplay, DefaultRootWindow(mDisplay), True,
+ GrabModeAsync, GrabModeAsync, CurrentTime);
+ if (vo_grabpointer)
+ XGrabPointer(mDisplay, DefaultRootWindow(mDisplay), True,
+ ButtonPressMask, GrabModeAsync, GrabModeAsync,
+ None, None, CurrentTime);
+
+ if (!vo_config_count || width != prev_width || height != prev_height)
+ {
+ init_video_buffers(vo_dga_base,
+ vo_dga_vp_height,
+ vo_dga_width * HW_MODE.vdm_bytespp,
#ifdef HAVE_DGA2
- modeline->maxViewportY,
+ modeline->maxViewportY,
#else
- vo_dga_vp_height,
+ vo_dga_vp_height,
#endif
- vo_doublebuffering);
- prev_width=width; prev_height=height;
- }
-
- mp_msg(MSGT_VO, MSGL_V, "vo_dga: Using %d frame buffer%s.\n",
- vo_dga_nr_video_buffers, vo_dga_nr_video_buffers == 1 ? "" : "s");
-
- vo_dga_is_running = 1;
- return 0;
+ vo_doublebuffering);
+ prev_width = width;
+ prev_height = height;
+ }
+
+ mp_msg(MSGT_VO, MSGL_V, "vo_dga: Using %d frame buffer%s.\n",
+ vo_dga_nr_video_buffers,
+ vo_dga_nr_video_buffers == 1 ? "" : "s");
+
+ vo_dga_is_running = 1;
+ return 0;
}
static int dga_depths_init = 0;
static uint32_t preinit(const char *arg)
{
- if(arg)
+ if (arg)
{
- mp_msg(MSGT_VO, MSGL_INFO, "vo_dga: Unknown subdevice: %s\n",arg);
- return ENOSYS;
+ mp_msg(MSGT_VO, MSGL_INFO, "vo_dga: Unknown subdevice: %s\n", arg);
+ return ENOSYS;
}
- if( !vo_init() ) return -1; // Can't open X11
+ if (!vo_init())
+ return -1; // Can't open X11
- if(dga_depths_init == 0){ // FIXME!?
- int i;
+ if (dga_depths_init == 0)
+ { // FIXME!?
+ int i;
- vo_dga_XServer_mode = vd_ValidateMode(vo_depthonscreen);
+ vo_dga_XServer_mode = vd_ValidateMode(vo_depthonscreen);
- if(vo_dga_XServer_mode ==0){
+ if (vo_dga_XServer_mode == 0)
+ {
#ifndef HAVE_DGA2
- mp_msg(MSGT_VO, MSGL_ERR, "vo_dga: Your X-Server is not running in a ");
- mp_msg(MSGT_VO, MSGL_ERR, "resolution supported by DGA driver!\n");
-#endif
- }//else{
- // mp_msg(MSGT_VO, MSGL_INFO, "vo_dga: X running at: %s\n",
- // vd_GetModeString(vo_dga_XServer_mode));
- //}
-
+ mp_msg(MSGT_VO, MSGL_ERR,
+ "vo_dga: Your X-Server is not running in a ");
+ mp_msg(MSGT_VO, MSGL_ERR,
+ "resolution supported by DGA driver!\n");
+#endif
+ } //else{
+ // mp_msg(MSGT_VO, MSGL_INFO, "vo_dga: X running at: %s\n",
+ // vd_GetModeString(vo_dga_XServer_mode));
+ //}
+
#ifdef HAVE_DGA2
- vo_modelines=XDGAQueryModes(mDisplay, mScreen, &vo_modecount);
- if(vo_modelines){
- for(i=0; i< vo_modecount; i++){
- mp_msg(MSGT_VO, MSGL_V, "vo_dga: (%03d) depth=%d, bpp=%d, r=%08x, g=%08x, b=%08x, %d x %d\n",
- i,
- vo_modelines[i].depth,
- vo_modelines[i].bitsPerPixel,
- vo_modelines[i].redMask,
- vo_modelines[i].greenMask,
- vo_modelines[i].blueMask,
- vo_modelines[i].viewportWidth,
- vo_modelines[i].viewportHeight);
- vd_EnableMode(
- vo_modelines[i].depth,
- vo_modelines[i].bitsPerPixel,
- vo_modelines[i].redMask,
- vo_modelines[i].greenMask,
- vo_modelines[i].blueMask);
- }
- }
-#endif
- dga_depths_init = 1;
-
- if( !vo_dga_modes[1].vdm_supported && vo_dga_modes[2].vdm_supported ){
- vo_dga_modes[1].vdm_supported = 1;
- }
-
- if( !vo_dga_modes[3].vdm_supported && vo_dga_modes[4].vdm_supported ){
- vo_dga_modes[3].vdm_supported = 1;
- }
-
- for(i=1; i<vo_dga_mode_num; i++){
- mp_msg(MSGT_VO, MSGL_INFO, "vo_dga: Mode: %s", vd_GetModeString(i));
- if(vo_dbpp && vo_dbpp != vo_dga_modes[i].vdm_mplayer_depth){
- vo_dga_modes[i].vdm_supported = 0;
- mp_msg(MSGT_VO, MSGL_INFO, " ...disabled by -bpp %d", vo_dbpp );
- }
- mp_msg(MSGT_VO, MSGL_INFO, "\n");
- }
- }
+ vo_modelines = XDGAQueryModes(mDisplay, mScreen, &vo_modecount);
+ if (vo_modelines)
+ {
+ for (i = 0; i < vo_modecount; i++)
+ {
+ mp_msg(MSGT_VO, MSGL_V,
+ "vo_dga: (%03d) depth=%d, bpp=%d, r=%08x, g=%08x, b=%08x, %d x %d\n",
+ i, vo_modelines[i].depth,
+ vo_modelines[i].bitsPerPixel,
+ vo_modelines[i].redMask, vo_modelines[i].greenMask,
+ vo_modelines[i].blueMask,
+ vo_modelines[i].viewportWidth,
+ vo_modelines[i].viewportHeight);
+ vd_EnableMode(vo_modelines[i].depth,
+ vo_modelines[i].bitsPerPixel,
+ vo_modelines[i].redMask,
+ vo_modelines[i].greenMask,
+ vo_modelines[i].blueMask);
+ }
+ }
+#endif
+ dga_depths_init = 1;
+
+ if (!vo_dga_modes[1].vdm_supported
+ && vo_dga_modes[2].vdm_supported)
+ {
+ vo_dga_modes[1].vdm_supported = 1;
+ }
+
+ if (!vo_dga_modes[3].vdm_supported
+ && vo_dga_modes[4].vdm_supported)
+ {
+ vo_dga_modes[3].vdm_supported = 1;
+ }
+
+ for (i = 1; i < vo_dga_mode_num; i++)
+ {
+ mp_msg(MSGT_VO, MSGL_INFO, "vo_dga: Mode: %s",
+ vd_GetModeString(i));
+ if (vo_dbpp && vo_dbpp != vo_dga_modes[i].vdm_mplayer_depth)
+ {
+ vo_dga_modes[i].vdm_supported = 0;
+ mp_msg(MSGT_VO, MSGL_INFO, " ...disabled by -bpp %d",
+ vo_dbpp);
+ }
+ mp_msg(MSGT_VO, MSGL_INFO, "\n");
+ }
+ }
return 0;
}
-static uint32_t get_image(mp_image_t *mpi)
+static uint32_t get_image(mp_image_t * mpi)
{
- if (
- !IMGFMT_IS_BGR(mpi->imgfmt) ||
- (IMGFMT_BGR_DEPTH(mpi->imgfmt) != vo_dga_modes[vo_dga_hw_mode].vdm_mplayer_depth) ||
- (mpi->type==MP_IMGTYPE_STATIC && vo_dga_nr_video_buffers>1) ||
- (mpi->type==MP_IMGTYPE_IP && vo_dga_nr_video_buffers<2) ||
- (mpi->type==MP_IMGTYPE_IPB)
- )
- return(VO_FALSE);
-
- if( (mpi->flags&MP_IMGFLAG_ACCEPT_STRIDE) ||
- (mpi->flags&MP_IMGFLAG_ACCEPT_WIDTH &&
- ((vo_dga_bytes_per_line+vo_dga_vp_skip)%(mpi->bpp/8))==0 ) ||
- (mpi->width*(mpi->bpp/8)==(vo_dga_bytes_per_line+vo_dga_vp_skip)) ){
-
- mpi->planes[0] = CURRENT_VIDEO_BUFFER.data + vo_dga_vp_offset;
- mpi->stride[0] = vo_dga_bytes_per_line + vo_dga_vp_skip;
- mpi->width=(vo_dga_bytes_per_line+vo_dga_vp_skip)/(mpi->bpp/8);
- mpi->flags |= MP_IMGFLAG_DIRECT;
- return(VO_TRUE);
+ if (!IMGFMT_IS_BGR(mpi->imgfmt) ||
+ (IMGFMT_BGR_DEPTH(mpi->imgfmt) !=
+ vo_dga_modes[vo_dga_hw_mode].vdm_mplayer_depth)
+ || (mpi->type == MP_IMGTYPE_STATIC && vo_dga_nr_video_buffers > 1)
+ || (mpi->type == MP_IMGTYPE_IP && vo_dga_nr_video_buffers < 2)
+ || (mpi->type == MP_IMGTYPE_IPB))
+ return (VO_FALSE);
+
+ if ((mpi->flags & MP_IMGFLAG_ACCEPT_STRIDE) ||
+ (mpi->flags & MP_IMGFLAG_ACCEPT_WIDTH &&
+ ((vo_dga_bytes_per_line + vo_dga_vp_skip) % (mpi->bpp / 8)) == 0)
+ || (mpi->width * (mpi->bpp / 8) ==
+ (vo_dga_bytes_per_line + vo_dga_vp_skip)))
+ {
+
+ mpi->planes[0] = CURRENT_VIDEO_BUFFER.data + vo_dga_vp_offset;
+ mpi->stride[0] = vo_dga_bytes_per_line + vo_dga_vp_skip;
+ mpi->width =
+ (vo_dga_bytes_per_line + vo_dga_vp_skip) / (mpi->bpp / 8);
+ mpi->flags |= MP_IMGFLAG_DIRECT;
+ return (VO_TRUE);
}
- return(VO_FALSE);
+ return (VO_FALSE);
}
static uint32_t control(uint32_t request, void *data, ...)
{
- switch (request) {
- case VOCTRL_GET_IMAGE:
- return get_image(data);
- case VOCTRL_QUERY_FORMAT:
- return query_format(*((uint32_t*)data));
- }
- return VO_NOTIMPL;
+ switch (request)
+ {
+ case VOCTRL_GET_IMAGE:
+ return get_image(data);
+ case VOCTRL_QUERY_FORMAT:
+ return query_format(*((uint32_t *) data));
+ }
+ return VO_NOTIMPL;
}
//---------------------------------------------------------
Index: vo_x11.c
===================================================================
RCS file: /cvsroot/mplayer/main/libvo/vo_x11.c,v
retrieving revision 1.137
retrieving revision 1.138
diff -u -r1.137 -r1.138
--- vo_x11.c 27 Dec 2003 19:45:54 -0000 1.137
+++ vo_x11.c 14 Jun 2004 04:53:02 -0000 1.138
@@ -25,20 +25,21 @@
#include <X11/extensions/XShm.h>
static int Shmem_Flag;
+
//static int Quiet_Flag; Here also what is this for. It's used but isn't inited ?
static XShmSegmentInfo Shminfo[1];
static int gXErrorFlag;
-static int CompletionType=-1;
+static int CompletionType = -1;
/* since it doesn't seem to be defined on some platforms */
-int XShmGetEventBase( Display* );
+int XShmGetEventBase(Display *);
#endif
#include "fastmemcpy.h"
#include "sub.h"
#include "../postproc/swscale.h"
-#include "../postproc/swscale_internal.h" //FIXME
+#include "../postproc/swscale_internal.h" //FIXME
#include "../postproc/rgb2rgb.h"
#include "../libmpcodecs/vf_scale.h"
@@ -49,26 +50,26 @@
#include "../mplayer.h"
#endif
-static vo_info_t info =
-{
- "X11 ( XImage/Shm )",
- "x11",
- "Aaron Holtzman <aholtzma at ess.engr.uvic.ca>",
- ""
+static vo_info_t info = {
+ "X11 ( XImage/Shm )",
+ "x11",
+ "Aaron Holtzman <aholtzma at ess.engr.uvic.ca>",
+ ""
};
-LIBVO_EXTERN( x11 )
-
+LIBVO_EXTERN(x11)
/* private prototypes */
-static void Display_Image ( XImage * myximage,unsigned char *ImageData );
-static void (*draw_alpha_fnc)(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride);
+static void Display_Image(XImage * myximage, unsigned char *ImageData);
+static void (*draw_alpha_fnc) (int x0, int y0, int w, int h,
+ unsigned char *src, unsigned char *srca,
+ int stride);
/* local data */
static unsigned char *ImageData;
/* X11 related variables */
static XImage *myximage = NULL;
-static int depth,bpp,mode;
+static int depth, bpp, mode;
static XWindowAttributes attribs;
static int int_pause;
@@ -80,48 +81,69 @@
static uint32_t image_width;
static uint32_t image_height;
static uint32_t in_format;
-static uint32_t out_format=0;
-static int srcW=-1;
-static int srcH=-1;
-static int aspect; // 1<<16 based fixed point aspect, so that the aspect stays correct during resizing
+static uint32_t out_format = 0;
+static int srcW = -1;
+static int srcH = -1;
+static int aspect; // 1<<16 based fixed point aspect, so that the aspect stays correct during resizing
+
+static int old_vo_dwidth = -1;
+static int old_vo_dheight = -1;
+
+static void check_events()
+{
+ int ret = vo_x11_check_events(mDisplay);
-static int old_vo_dwidth=-1;
-static int old_vo_dheight=-1;
+ /* clear left over borders and redraw frame if we are paused */
+ if (ret & VO_EVENT_EXPOSE && int_pause)
+ {
+ vo_x11_clearwindow_part(mDisplay, vo_window, myximage->width,
+ myximage->height, 0);
+ flip_page();
+ } else if ((ret & VO_EVENT_RESIZE) || (ret & VO_EVENT_EXPOSE))
+ vo_x11_clearwindow_part(mDisplay, vo_window, myximage->width,
+ myximage->height, 0);
-static void check_events(){
- int ret = vo_x11_check_events(mDisplay);
-
- /* clear left over borders and redraw frame if we are paused */
- if ( ret & VO_EVENT_EXPOSE && int_pause)
- {
- vo_x11_clearwindow_part(mDisplay, vo_window, myximage->width, myximage->height, 0);
- flip_page();
- } else
- if ( (ret & VO_EVENT_RESIZE)||(ret & VO_EVENT_EXPOSE) )
- vo_x11_clearwindow_part(mDisplay, vo_window, myximage->width, myximage->height, 0);
-
}
-static void draw_alpha_32(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){
- vo_draw_alpha_rgb32(w,h,src,srca,stride,ImageData+4*(y0*image_width+x0),4*image_width);
+static void draw_alpha_32(int x0, int y0, int w, int h, unsigned char *src,
+ unsigned char *srca, int stride)
+{
+ vo_draw_alpha_rgb32(w, h, src, srca, stride,
+ ImageData + 4 * (y0 * image_width + x0),
+ 4 * image_width);
}
-static void draw_alpha_24(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){
- vo_draw_alpha_rgb24(w,h,src,srca,stride,ImageData+3*(y0*image_width+x0),3*image_width);
+static void draw_alpha_24(int x0, int y0, int w, int h, unsigned char *src,
+ unsigned char *srca, int stride)
+{
+ vo_draw_alpha_rgb24(w, h, src, srca, stride,
+ ImageData + 3 * (y0 * image_width + x0),
+ 3 * image_width);
}
-static void draw_alpha_16(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){
- vo_draw_alpha_rgb16(w,h,src,srca,stride,ImageData+2*(y0*image_width+x0),2*image_width);
+static void draw_alpha_16(int x0, int y0, int w, int h, unsigned char *src,
+ unsigned char *srca, int stride)
+{
+ vo_draw_alpha_rgb16(w, h, src, srca, stride,
+ ImageData + 2 * (y0 * image_width + x0),
+ 2 * image_width);
}
-static void draw_alpha_15(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){
- vo_draw_alpha_rgb15(w,h,src,srca,stride,ImageData+2*(y0*image_width+x0),2*image_width);
+static void draw_alpha_15(int x0, int y0, int w, int h, unsigned char *src,
+ unsigned char *srca, int stride)
+{
+ vo_draw_alpha_rgb15(w, h, src, srca, stride,
+ ImageData + 2 * (y0 * image_width + x0),
+ 2 * image_width);
}
-static void draw_alpha_null(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){
+static void draw_alpha_null(int x0, int y0, int w, int h,
+ unsigned char *src, unsigned char *srca,
+ int stride)
+{
}
-static SwsContext *swsContext=NULL;
+static SwsContext *swsContext = NULL;
extern int sws_flags;
static XVisualInfo vinfo;
@@ -129,464 +151,557 @@
static void getMyXImage()
{
#ifdef HAVE_SHM
- if ( mLocalDisplay && XShmQueryExtension( mDisplay ) ) Shmem_Flag=1;
- else
- {
- Shmem_Flag=0;
- mp_msg(MSGT_VO,MSGL_WARN, "Shared memory not supported\nReverting to normal Xlib\n" );
- }
- if ( Shmem_Flag ) CompletionType=XShmGetEventBase( mDisplay ) + ShmCompletion;
-
- if ( Shmem_Flag )
- {
- myximage=XShmCreateImage( mDisplay,vinfo.visual,depth,ZPixmap,NULL,&Shminfo[0],image_width,image_height );
- if ( myximage == NULL )
- {
- if ( myximage != NULL ) XDestroyImage( myximage );
- mp_msg(MSGT_VO,MSGL_WARN,"Shared memory error,disabling ( Ximage error )\n" );
- goto shmemerror;
- }
- Shminfo[0].shmid=shmget( IPC_PRIVATE,
- myximage->bytes_per_line * myximage->height ,
- IPC_CREAT | 0777 );
- if ( Shminfo[0].shmid < 0 )
- {
- XDestroyImage( myximage );
- mp_msg(MSGT_VO,MSGL_V, "%s\n",strerror( errno ) );
- //perror( strerror( errno ) );
- mp_msg(MSGT_VO,MSGL_WARN,"Shared memory error,disabling ( seg id error )\n" );
- goto shmemerror;
- }
- Shminfo[0].shmaddr=( char * ) shmat( Shminfo[0].shmid,0,0 );
-
- if ( Shminfo[0].shmaddr == ( ( char * ) -1 ) )
- {
- XDestroyImage( myximage );
- if ( Shminfo[0].shmaddr != ( ( char * ) -1 ) ) shmdt( Shminfo[0].shmaddr );
- mp_msg(MSGT_VO,MSGL_WARN, "Shared memory error,disabling ( address error )\n" );
- goto shmemerror;
- }
- myximage->data=Shminfo[0].shmaddr;
- ImageData=( unsigned char * ) myximage->data;
- Shminfo[0].readOnly=False;
- XShmAttach( mDisplay,&Shminfo[0] );
-
- XSync( mDisplay,False );
-
- if ( gXErrorFlag )
- {
- XDestroyImage( myximage );
- shmdt( Shminfo[0].shmaddr );
- mp_msg(MSGT_VO,MSGL_WARN, "Shared memory error,disabling.\n" );
- gXErrorFlag=0;
- goto shmemerror;
- }
- else
- shmctl( Shminfo[0].shmid,IPC_RMID,0 );
-
- {
- static int firstTime=1;
- if ( firstTime){
- mp_msg(MSGT_VO,MSGL_V, "Sharing memory.\n" );
- firstTime=0;
- }
- }
- }
- else
- {
- shmemerror:
- Shmem_Flag=0;
-#endif
- myximage=XGetImage( mDisplay,vo_window,0,0,
- image_width,image_height,AllPlanes,ZPixmap );
- ImageData=myximage->data;
+ if (mLocalDisplay && XShmQueryExtension(mDisplay))
+ Shmem_Flag = 1;
+ else
+ {
+ Shmem_Flag = 0;
+ mp_msg(MSGT_VO, MSGL_WARN,
+ "Shared memory not supported\nReverting to normal Xlib\n");
+ }
+ if (Shmem_Flag)
+ CompletionType = XShmGetEventBase(mDisplay) + ShmCompletion;
+
+ if (Shmem_Flag)
+ {
+ myximage =
+ XShmCreateImage(mDisplay, vinfo.visual, depth, ZPixmap, NULL,
+ &Shminfo[0], image_width, image_height);
+ if (myximage == NULL)
+ {
+ if (myximage != NULL)
+ XDestroyImage(myximage);
+ mp_msg(MSGT_VO, MSGL_WARN,
+ "Shared memory error,disabling ( Ximage error )\n");
+ goto shmemerror;
+ }
+ Shminfo[0].shmid = shmget(IPC_PRIVATE,
+ myximage->bytes_per_line *
+ myximage->height, IPC_CREAT | 0777);
+ if (Shminfo[0].shmid < 0)
+ {
+ XDestroyImage(myximage);
+ mp_msg(MSGT_VO, MSGL_V, "%s\n", strerror(errno));
+ //perror( strerror( errno ) );
+ mp_msg(MSGT_VO, MSGL_WARN,
+ "Shared memory error,disabling ( seg id error )\n");
+ goto shmemerror;
+ }
+ Shminfo[0].shmaddr = (char *) shmat(Shminfo[0].shmid, 0, 0);
+
+ if (Shminfo[0].shmaddr == ((char *) -1))
+ {
+ XDestroyImage(myximage);
+ if (Shminfo[0].shmaddr != ((char *) -1))
+ shmdt(Shminfo[0].shmaddr);
+ mp_msg(MSGT_VO, MSGL_WARN,
+ "Shared memory error,disabling ( address error )\n");
+ goto shmemerror;
+ }
+ myximage->data = Shminfo[0].shmaddr;
+ ImageData = (unsigned char *) myximage->data;
+ Shminfo[0].readOnly = False;
+ XShmAttach(mDisplay, &Shminfo[0]);
+
+ XSync(mDisplay, False);
+
+ if (gXErrorFlag)
+ {
+ XDestroyImage(myximage);
+ shmdt(Shminfo[0].shmaddr);
+ mp_msg(MSGT_VO, MSGL_WARN, "Shared memory error,disabling.\n");
+ gXErrorFlag = 0;
+ goto shmemerror;
+ } else
+ shmctl(Shminfo[0].shmid, IPC_RMID, 0);
+
+ {
+ static int firstTime = 1;
+
+ if (firstTime)
+ {
+ mp_msg(MSGT_VO, MSGL_V, "Sharing memory.\n");
+ firstTime = 0;
+ }
+ }
+ } else
+ {
+ shmemerror:
+ Shmem_Flag = 0;
+#endif
+ myximage = XGetImage(mDisplay, vo_window, 0, 0,
+ image_width, image_height, AllPlanes,
+ ZPixmap);
+ ImageData = myximage->data;
#ifdef HAVE_SHM
- }
+ }
#endif
}
static void freeMyXImage()
{
#ifdef HAVE_SHM
- if ( Shmem_Flag )
- {
- XShmDetach( mDisplay,&Shminfo[0] );
- XDestroyImage( myximage );
- shmdt( Shminfo[0].shmaddr );
- }
- else
-#endif
- {
- XDestroyImage( myximage );
- }
- myximage=NULL;
+ if (Shmem_Flag)
+ {
+ XShmDetach(mDisplay, &Shminfo[0]);
+ XDestroyImage(myximage);
+ shmdt(Shminfo[0].shmaddr);
+ } else
+#endif
+ {
+ XDestroyImage(myximage);
+ }
+ myximage = NULL;
}
-static uint32_t config( uint32_t width,uint32_t height,uint32_t d_width,uint32_t d_height,uint32_t flags,char *title,uint32_t format)
+static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width,
+ uint32_t d_height, uint32_t flags, char *title,
+ uint32_t format)
{
// int screen;
- int fullscreen=0;
- int vm=0;
+ int fullscreen = 0;
+ int vm = 0;
+
// int interval, prefer_blank, allow_exp, nothing;
- unsigned int fg,bg;
- XEvent xev;
- XGCValues xgcv;
- Colormap theCmap;
- XSetWindowAttributes xswa;
- unsigned long xswamask;
+ unsigned int fg, bg;
+ XEvent xev;
+ XGCValues xgcv;
+ Colormap theCmap;
+ XSetWindowAttributes xswa;
+ unsigned long xswamask;
+
#ifdef HAVE_XF86VM
- unsigned int modeline_width, modeline_height;
- static uint32_t vm_width;
- static uint32_t vm_height;
-#endif
-
- vo_mouse_autohide=1;
- old_vo_dwidth=-1;
- old_vo_dheight=-1;
-
- if (!title)
- title = strdup("MPlayer X11 (XImage/Shm) render");
-
- in_format=format;
- srcW= width;
- srcH= height;
- vo_dx=( vo_screenwidth - d_width ) / 2; vo_dy=( vo_screenheight - d_height ) / 2;
- geometry(&vo_dx, &vo_dy, &d_width, &d_height, vo_screenwidth, vo_screenheight);
- vo_dwidth=d_width; vo_dheight=d_height;
-
- if( flags&0x03 ) fullscreen = 1;
- if( flags&0x02 ) vm = 1;
- if( flags&0x08 ) Flip_Flag = 1;
- zoomFlag = flags&0x04;
+ unsigned int modeline_width, modeline_height;
+ static uint32_t vm_width;
+ static uint32_t vm_height;
+#endif
+
+ vo_mouse_autohide = 1;
+ old_vo_dwidth = -1;
+ old_vo_dheight = -1;
+
+ if (!title)
+ title = strdup("MPlayer X11 (XImage/Shm) render");
+
+ in_format = format;
+ srcW = width;
+ srcH = height;
+ vo_dx = (vo_screenwidth - d_width) / 2;
+ vo_dy = (vo_screenheight - d_height) / 2;
+ geometry(&vo_dx, &vo_dy, &d_width, &d_height, vo_screenwidth,
+ vo_screenheight);
+ vo_dwidth = d_width;
+ vo_dheight = d_height;
+
+ if (flags & 0x03)
+ fullscreen = 1;
+ if (flags & 0x02)
+ vm = 1;
+ if (flags & 0x08)
+ Flip_Flag = 1;
+ zoomFlag = flags & 0x04;
- int_pause = 0;
+ int_pause = 0;
// if(!fullscreen) zoomFlag=1; //it makes no sense to avoid zooming on windowd mode
-
+
//printf( "w: %d h: %d\n\n",vo_dwidth,vo_dheight );
- XGetWindowAttributes( mDisplay,mRootWin,&attribs );
- depth=attribs.depth;
+ XGetWindowAttributes(mDisplay, mRootWin, &attribs);
+ depth = attribs.depth;
+
+ if (depth != 15 && depth != 16 && depth != 24 && depth != 32)
+ {
+ Visual *visual;
- if ( depth != 15 && depth != 16 && depth != 24 && depth != 32 ) {
- Visual *visual;
- depth = vo_find_depth_from_visuals(mDisplay, mScreen, &visual);
- }
- if ( !XMatchVisualInfo( mDisplay,mScreen,depth,DirectColor,&vinfo ) ||
- (WinID > 0 && vinfo.visualid != XVisualIDFromVisual(attribs.visual)))
- XMatchVisualInfo( mDisplay,mScreen,depth,TrueColor,&vinfo );
-
- /* set image size (which is indeed neither the input nor output size),
- if zoom is on it will be changed during draw_slice anyway so we don't duplicate the aspect code here
- */
- image_width=(width + 7) & (~7);
- image_height=height;
+ depth = vo_find_depth_from_visuals(mDisplay, mScreen, &visual);
+ }
+ if (!XMatchVisualInfo(mDisplay, mScreen, depth, DirectColor, &vinfo) ||
+ (WinID > 0
+ && vinfo.visualid != XVisualIDFromVisual(attribs.visual)))
+ XMatchVisualInfo(mDisplay, mScreen, depth, TrueColor, &vinfo);
+
+ /* set image size (which is indeed neither the input nor output size),
+ if zoom is on it will be changed during draw_slice anyway so we don't duplicate the aspect code here
+ */
+ image_width = (width + 7) & (~7);
+ image_height = height;
- aspect= ((1<<16)*d_width + d_height/2)/d_height;
+ aspect = ((1 << 16) * d_width + d_height / 2) / d_height;
#ifdef HAVE_NEW_GUI
- if(use_gui) guiGetEvent( guiSetShVideo,0 ); // the GUI will set up / resize the window
- else
-#endif
- {
+ if (use_gui)
+ guiGetEvent(guiSetShVideo, 0); // the GUI will set up / resize the window
+ else
+#endif
+ {
#ifdef HAVE_XF86VM
- if ( vm )
- {
- if ((d_width==0) && (d_height==0))
- { vm_width=image_width; vm_height=image_height; }
- else
- { vm_width=d_width; vm_height=d_height; }
- vo_vm_switch(vm_width, vm_height,&modeline_width, &modeline_height);
- vo_dx=(vo_screenwidth-modeline_width)/2;
- vo_dy=(vo_screenheight-modeline_height)/2;
- vo_dwidth=modeline_width;
- vo_dheight=modeline_height;
- }
-#endif
- bg=WhitePixel( mDisplay,mScreen );
- fg=BlackPixel( mDisplay,mScreen );
-
- theCmap=vo_x11_create_colormap(&vinfo);
-
- xswa.background_pixel=0;
- xswa.border_pixel=0;
- xswa.colormap=theCmap;
- xswamask=CWBackPixel | CWBorderPixel | CWColormap;
+ if (vm)
+ {
+ if ((d_width == 0) && (d_height == 0))
+ {
+ vm_width = image_width;
+ vm_height = image_height;
+ } else
+ {
+ vm_width = d_width;
+ vm_height = d_height;
+ }
+ vo_vm_switch(vm_width, vm_height, &modeline_width,
+ &modeline_height);
+ vo_dx = (vo_screenwidth - modeline_width) / 2;
+ vo_dy = (vo_screenheight - modeline_height) / 2;
+ vo_dwidth = modeline_width;
+ vo_dheight = modeline_height;
+ }
+#endif
+ bg = WhitePixel(mDisplay, mScreen);
+ fg = BlackPixel(mDisplay, mScreen);
+
+ theCmap = vo_x11_create_colormap(&vinfo);
+
+ xswa.background_pixel = 0;
+ xswa.border_pixel = 0;
+ xswa.colormap = theCmap;
+ xswamask = CWBackPixel | CWBorderPixel | CWColormap;
#ifdef HAVE_XF86VM
- if ( vm )
- {
- xswa.override_redirect=True;
- xswamask|=CWOverrideRedirect;
- }
-#endif
-
- if ( WinID>=0 ){
- vo_window = WinID ? ((Window)WinID) : mRootWin;
- if ( WinID )
- {
- XUnmapWindow( mDisplay,vo_window );
- XChangeWindowAttributes( mDisplay,vo_window,xswamask,&xswa );
- vo_x11_selectinput_witherr( mDisplay,vo_window,StructureNotifyMask | KeyPressMask | PropertyChangeMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask | ExposureMask );
- XMapWindow( mDisplay,vo_window );
- } else 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 (vm)
+ {
+ xswa.override_redirect = True;
+ xswamask |= CWOverrideRedirect;
+ }
+#endif
+
+ if (WinID >= 0)
+ {
+ vo_window = WinID ? ((Window) WinID) : mRootWin;
+ if (WinID)
+ {
+ XUnmapWindow(mDisplay, vo_window);
+ XChangeWindowAttributes(mDisplay, vo_window, xswamask,
+ &xswa);
+ vo_x11_selectinput_witherr(mDisplay, vo_window,
+ StructureNotifyMask |
+ KeyPressMask |
+ PropertyChangeMask |
+ PointerMotionMask |
+ ButtonPressMask |
+ ButtonReleaseMask |
+ ExposureMask);
+ XMapWindow(mDisplay, vo_window);
+ } else
+ 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 );
-
- if ( fullscreen ) vo_x11_fullscreen();
+ do
+ {
+ XNextEvent(mDisplay, &xev);
+ }
+ while (xev.type != MapNotify
+ || xev.xmap.event != vo_window);
+
+ if (fullscreen)
+ vo_x11_fullscreen();
#ifdef HAVE_XINERAMA
- vo_x11_xinerama_move(mDisplay,vo_window);
+ vo_x11_xinerama_move(mDisplay, vo_window);
#endif
- } else if ( !fullscreen ) XMoveResizeWindow( mDisplay,vo_window,vo_dx,vo_dy,vo_dwidth,vo_dheight );
- }
+ } else if (!fullscreen)
+ XMoveResizeWindow(mDisplay, vo_window, vo_dx, vo_dy,
+ vo_dwidth, vo_dheight);
+ }
+
+ XFlush(mDisplay);
+ XSync(mDisplay, False);
+
+ // we cannot grab mouse events on root window :(
+ vo_x11_selectinput_witherr(mDisplay, vo_window,
+ StructureNotifyMask | KeyPressMask |
+ PropertyChangeMask | ExposureMask |
+ ((WinID ==
+ 0) ? 0 : (ButtonPressMask |
+ ButtonReleaseMask |
+ PointerMotionMask)));
- XFlush( mDisplay );
- XSync( mDisplay,False );
+#ifdef HAVE_XF86VM
+ if (vm)
+ {
+ /* Grab the mouse pointer in our window */
+ if (vo_grabpointer)
+ XGrabPointer(mDisplay, vo_window, True, 0,
+ GrabModeAsync, GrabModeAsync,
+ vo_window, None, CurrentTime);
+ XSetInputFocus(mDisplay, vo_window, RevertToNone, CurrentTime);
+ }
+#endif
+ }
- // we cannot grab mouse events on root window :(
- vo_x11_selectinput_witherr( mDisplay,vo_window,StructureNotifyMask | KeyPressMask | PropertyChangeMask | ExposureMask |
- ((WinID==0)?0:(ButtonPressMask | ButtonReleaseMask | PointerMotionMask)) );
+ if (vo_gc != None)
+ XFreeGC(mDisplay, vo_gc);
+ vo_gc = XCreateGC(mDisplay, vo_window, 0L, &xgcv);
-#ifdef HAVE_XF86VM
- if ( vm )
- {
- /* Grab the mouse pointer in our window */
- if(vo_grabpointer)
- XGrabPointer(mDisplay, vo_window, True, 0,
- GrabModeAsync, GrabModeAsync,
- vo_window, None, CurrentTime);
- XSetInputFocus(mDisplay, vo_window, RevertToNone, CurrentTime);
- }
-#endif
- }
-
- if ( vo_gc != None ) XFreeGC( mDisplay,vo_gc );
- vo_gc=XCreateGC( mDisplay,vo_window,0L,&xgcv );
-
- if ( myximage )
- {
- freeMyXImage();
- sws_freeContext(swsContext);
- }
- getMyXImage();
-
- if ( !WinID )
- { vo_dwidth=vo_screenwidth; vo_dheight=vo_screenheight; }
-
- switch ((bpp=myximage->bits_per_pixel)){
- case 24: draw_alpha_fnc=draw_alpha_24;
- out_format= IMGFMT_BGR24; break;
- case 32: draw_alpha_fnc=draw_alpha_32;
- out_format= IMGFMT_BGR32; break;
- case 15:
- case 16: if (depth==15){
- draw_alpha_fnc=draw_alpha_15;
- out_format= IMGFMT_BGR15;
- }else{
- draw_alpha_fnc=draw_alpha_16;
- out_format= IMGFMT_BGR16;
- }break;
- case 8: draw_alpha_fnc=draw_alpha_null;
- out_format= IMGFMT_BGR8; break;
- default: draw_alpha_fnc=draw_alpha_null;
- }
-
- /* always allocate swsContext as size could change between frames */
- swsContext= sws_getContextFromCmdLine(width, height, in_format, width, height, out_format );
- if (!swsContext)
- return -1;
+ if (myximage)
+ {
+ freeMyXImage();
+ sws_freeContext(swsContext);
+ }
+ getMyXImage();
- //printf( "X11 bpp: %d color mask: R:%lX G:%lX B:%lX\n",bpp,myximage->red_mask,myximage->green_mask,myximage->blue_mask );
+ if (!WinID)
+ {
+ vo_dwidth = vo_screenwidth;
+ vo_dheight = vo_screenheight;
+ }
+
+ switch ((bpp = myximage->bits_per_pixel))
+ {
+ case 24:
+ draw_alpha_fnc = draw_alpha_24;
+ out_format = IMGFMT_BGR24;
+ break;
+ case 32:
+ draw_alpha_fnc = draw_alpha_32;
+ out_format = IMGFMT_BGR32;
+ break;
+ case 15:
+ case 16:
+ if (depth == 15)
+ {
+ draw_alpha_fnc = draw_alpha_15;
+ out_format = IMGFMT_BGR15;
+ } else
+ {
+ draw_alpha_fnc = draw_alpha_16;
+ out_format = IMGFMT_BGR16;
+ }
+ break;
+ case 8:
+ draw_alpha_fnc = draw_alpha_null;
+ out_format = IMGFMT_BGR8;
+ break;
+ default:
+ draw_alpha_fnc = draw_alpha_null;
+ }
+
+ /* always allocate swsContext as size could change between frames */
+ swsContext =
+ sws_getContextFromCmdLine(width, height, in_format, width, height,
+ out_format);
+ if (!swsContext)
+ return -1;
+
+ //printf( "X11 bpp: %d color mask: R:%lX G:%lX B:%lX\n",bpp,myximage->red_mask,myximage->green_mask,myximage->blue_mask );
- // If we have blue in the lowest bit then obviously RGB
- mode=( ( myximage->blue_mask & 0x01 ) != 0 ) ? MODE_RGB : MODE_BGR;
+ // If we have blue in the lowest bit then obviously RGB
+ mode = ((myximage->blue_mask & 0x01) != 0) ? MODE_RGB : MODE_BGR;
#ifdef WORDS_BIGENDIAN
- if ( myximage->byte_order != MSBFirst )
+ if (myximage->byte_order != MSBFirst)
#else
- if ( myximage->byte_order != LSBFirst )
+ if (myximage->byte_order != LSBFirst)
#endif
- {
- mode=( ( myximage->blue_mask & 0x01 ) != 0 ) ? MODE_BGR : MODE_RGB;
+ {
+ mode = ((myximage->blue_mask & 0x01) != 0) ? MODE_BGR : MODE_RGB;
// printf( "No support for non-native XImage byte order!\n" );
// return -1;
- }
-
+ }
#ifdef WORDS_BIGENDIAN
- if(mode==MODE_BGR && bpp!=32){
- mp_msg(MSGT_VO,MSGL_ERR,"BGR%d not supported, please contact the developers\n", bpp);
- return -1;
- }
+ if (mode == MODE_BGR && bpp != 32)
+ {
+ mp_msg(MSGT_VO, MSGL_ERR,
+ "BGR%d not supported, please contact the developers\n",
+ bpp);
+ return -1;
+ }
#else
- if(mode==MODE_BGR){
- mp_msg(MSGT_VO,MSGL_ERR,"BGR not supported, please contact the developers\n");
- return -1;
- }
-#endif
+ if (mode == MODE_BGR)
+ {
+ mp_msg(MSGT_VO, MSGL_ERR,
+ "BGR not supported, please contact the developers\n");
+ return -1;
+ }
+#endif
- saver_off(mDisplay);
+ saver_off(mDisplay);
- if (vo_ontop) vo_x11_setlayer(mDisplay, vo_window, vo_ontop);
+ if (vo_ontop)
+ vo_x11_setlayer(mDisplay, vo_window, vo_ontop);
- return 0;
+ return 0;
}
-static void Display_Image( XImage *myximage,uint8_t *ImageData )
+static void Display_Image(XImage * myximage, uint8_t * ImageData)
{
#ifdef HAVE_SHM
- if ( Shmem_Flag )
- {
- XShmPutImage( mDisplay,vo_window,vo_gc,myximage,
- 0,0,
- ( vo_dwidth - swsContext->dstW ) / 2,( vo_dheight - myximage->height ) / 2,
- swsContext->dstW,myximage->height,True );
- }
- else
-#endif
- {
- XPutImage( mDisplay,vo_window,vo_gc,myximage,
- 0,0,
- ( vo_dwidth - swsContext->dstW ) / 2,( vo_dheight - myximage->height ) / 2,
- swsContext->dstW,myximage->height);
- }
+ if (Shmem_Flag)
+ {
+ XShmPutImage(mDisplay, vo_window, vo_gc, myximage,
+ 0, 0,
+ (vo_dwidth - swsContext->dstW) / 2,
+ (vo_dheight - myximage->height) / 2, swsContext->dstW,
+ myximage->height, True);
+ } else
+#endif
+ {
+ XPutImage(mDisplay, vo_window, vo_gc, myximage,
+ 0, 0,
+ (vo_dwidth - swsContext->dstW) / 2,
+ (vo_dheight - myximage->height) / 2, swsContext->dstW,
+ myximage->height);
+ }
}
static void draw_osd(void)
-{ vo_draw_text(image_width,image_height,draw_alpha_fnc); }
+{
+ vo_draw_text(image_width, image_height, draw_alpha_fnc);
+}
-static void flip_page( void ){
- Display_Image( myximage,ImageData );
+static void flip_page(void)
+{
+ Display_Image(myximage, ImageData);
XSync(mDisplay, False);
}
-static uint32_t draw_slice( uint8_t *src[],int stride[],int w,int h,int x,int y )
+static uint32_t draw_slice(uint8_t * src[], int stride[], int w, int h,
+ int x, int y)
{
- uint8_t *dst[3];
- int dstStride[3];
+ uint8_t *dst[3];
+ int dstStride[3];
- if((old_vo_dwidth != vo_dwidth || old_vo_dheight != vo_dheight) /*&& y==0*/ && zoomFlag)
- {
- int newW= vo_dwidth;
- int newH= vo_dheight;
- int newAspect= (newW*(1<<16) + (newH>>1))/newH;
- SwsContext *oldContext= swsContext;
-
- if(newAspect>aspect) newW= (newH*aspect + (1<<15))>>16;
- else newH= ((newW<<16) + (aspect>>1)) /aspect;
-
- old_vo_dwidth= vo_dwidth;
- old_vo_dheight= vo_dheight;
-
- if(sws_flags==0) newW&= (~31); // not needed but, if the user wants the FAST_BILINEAR SCALER, then its needed
-
- swsContext= sws_getContextFromCmdLine(srcW, srcH, in_format,
- newW, newH, out_format);
- if(swsContext)
- {
- image_width= (newW+7)&(~7);
- image_height= newH;
-
- freeMyXImage();
- getMyXImage();
- sws_freeContext(oldContext);
- }
- else
+ if ((old_vo_dwidth != vo_dwidth
+ || old_vo_dheight != vo_dheight) /*&& y==0 */ && zoomFlag)
{
- swsContext= oldContext;
+ int newW = vo_dwidth;
+ int newH = vo_dheight;
+ int newAspect = (newW * (1 << 16) + (newH >> 1)) / newH;
+ SwsContext *oldContext = swsContext;
+
+ if (newAspect > aspect)
+ newW = (newH * aspect + (1 << 15)) >> 16;
+ else
+ newH = ((newW << 16) + (aspect >> 1)) / aspect;
+
+ old_vo_dwidth = vo_dwidth;
+ old_vo_dheight = vo_dheight;
+
+ if (sws_flags == 0)
+ newW &= (~31); // not needed but, if the user wants the FAST_BILINEAR SCALER, then its needed
+
+ swsContext = sws_getContextFromCmdLine(srcW, srcH, in_format,
+ newW, newH, out_format);
+ if (swsContext)
+ {
+ image_width = (newW + 7) & (~7);
+ image_height = newH;
+
+ freeMyXImage();
+ getMyXImage();
+ sws_freeContext(oldContext);
+ } else
+ {
+ swsContext = oldContext;
+ }
}
- }
- dstStride[1]=
- dstStride[2]=0;
- dst[1]=
- dst[2]=NULL;
-
- if(Flip_Flag)
- {
- dstStride[0]= -image_width*((bpp+7)/8);
- dst[0]=ImageData - dstStride[0]*(image_height-1);
- sws_scale_ordered(swsContext,src,stride,y,h,dst, dstStride);
- }
- else
- {
- dstStride[0]=image_width*((bpp+7)/8);
- dst[0]=ImageData;
- sws_scale_ordered(swsContext,src,stride,y,h,dst, dstStride);
- }
- return 0;
+ dstStride[1] = dstStride[2] = 0;
+ dst[1] = dst[2] = NULL;
+
+ if (Flip_Flag)
+ {
+ dstStride[0] = -image_width * ((bpp + 7) / 8);
+ dst[0] = ImageData - dstStride[0] * (image_height - 1);
+ sws_scale_ordered(swsContext, src, stride, y, h, dst, dstStride);
+ } else
+ {
+ dstStride[0] = image_width * ((bpp + 7) / 8);
+ dst[0] = ImageData;
+ sws_scale_ordered(swsContext, src, stride, y, h, dst, dstStride);
+ }
+ return 0;
}
-static uint32_t draw_frame( uint8_t *src[] ){
+static uint32_t draw_frame(uint8_t * src[])
+{
#if 0
- int stride[3]= {0,0,0};
-
- if (in_format==IMGFMT_YUY2) stride[0]=srcW*2;
- else if(in_format==IMGFMT_BGR8) stride[0]=srcW;
- else if(in_format==IMGFMT_BGR15) stride[0]=srcW*2;
- else if(in_format==IMGFMT_BGR16) stride[0]=srcW*2;
- else if(in_format==IMGFMT_BGR24) stride[0]=srcW*3;
- else if(in_format==IMGFMT_BGR32) stride[0]=srcW*4;
-
- return draw_slice(src, stride, srcW, srcH, 0, 0);
+ int stride[3] = { 0, 0, 0 };
+
+ if (in_format == IMGFMT_YUY2)
+ stride[0] = srcW * 2;
+ else if (in_format == IMGFMT_BGR8)
+ stride[0] = srcW;
+ else if (in_format == IMGFMT_BGR15)
+ stride[0] = srcW * 2;
+ else if (in_format == IMGFMT_BGR16)
+ stride[0] = srcW * 2;
+ else if (in_format == IMGFMT_BGR24)
+ stride[0] = srcW * 3;
+ else if (in_format == IMGFMT_BGR32)
+ stride[0] = srcW * 4;
+
+ return draw_slice(src, stride, srcW, srcH, 0, 0);
#else
printf("draw_frame() called!!!!!!\n");
return -1;
#endif
}
-static uint32_t get_image(mp_image_t *mpi)
+static uint32_t get_image(mp_image_t * mpi)
{
if (zoomFlag ||
- !IMGFMT_IS_BGR(mpi->imgfmt) ||
- (IMGFMT_BGR_DEPTH(mpi->imgfmt) != vo_depthonscreen) ||
- ((mpi->type != MP_IMGTYPE_STATIC) && (mpi->type != MP_IMGTYPE_TEMP)) ||
- (mpi->flags & MP_IMGFLAG_PLANAR) ||
- (mpi->flags & MP_IMGFLAG_YUV) ||
- (mpi->width != image_width) ||
- (mpi->height != image_height)
- )
- return(VO_FALSE);
+ !IMGFMT_IS_BGR(mpi->imgfmt) ||
+ (IMGFMT_BGR_DEPTH(mpi->imgfmt) != vo_depthonscreen) ||
+ ((mpi->type != MP_IMGTYPE_STATIC)
+ && (mpi->type != MP_IMGTYPE_TEMP))
+ || (mpi->flags & MP_IMGFLAG_PLANAR)
+ || (mpi->flags & MP_IMGFLAG_YUV) || (mpi->width != image_width)
+ || (mpi->height != image_height))
+ return (VO_FALSE);
if (Flip_Flag)
{
- mpi->stride[0] = -image_width*((bpp+7)/8);
- mpi->planes[0] = ImageData - mpi->stride[0]*(image_height-1);
- }
- else
+ mpi->stride[0] = -image_width * ((bpp + 7) / 8);
+ mpi->planes[0] = ImageData - mpi->stride[0] * (image_height - 1);
+ } else
{
- mpi->stride[0] = image_width*((bpp+7)/8);
- mpi->planes[0] = ImageData;
+ mpi->stride[0] = image_width * ((bpp + 7) / 8);
+ mpi->planes[0] = ImageData;
}
mpi->flags |= MP_IMGFLAG_DIRECT;
-
- return(VO_TRUE);
+
+ return (VO_TRUE);
}
-static uint32_t query_format( uint32_t format )
+static uint32_t query_format(uint32_t format)
{
- mp_msg(MSGT_VO,MSGL_DBG2,"vo_x11: query_format was called: %x (%s)\n",format,vo_format_name(format));
+ mp_msg(MSGT_VO, MSGL_DBG2,
+ "vo_x11: query_format was called: %x (%s)\n", format,
+ vo_format_name(format));
if (IMGFMT_IS_BGR(format))
{
- if (IMGFMT_BGR_DEPTH(format) <= 8)
- return 0; // TODO 8bpp not yet fully implemented
- if (IMGFMT_BGR_DEPTH(format) == vo_depthonscreen)
- return 3|VFCAP_OSD|VFCAP_SWSCALE|VFCAP_FLIP|VFCAP_ACCEPT_STRIDE;
- else
- return 1|VFCAP_OSD|VFCAP_SWSCALE|VFCAP_FLIP|VFCAP_ACCEPT_STRIDE;
+ if (IMGFMT_BGR_DEPTH(format) <= 8)
+ return 0; // TODO 8bpp not yet fully implemented
+ if (IMGFMT_BGR_DEPTH(format) == vo_depthonscreen)
+ return 3 | VFCAP_OSD | VFCAP_SWSCALE | VFCAP_FLIP |
+ VFCAP_ACCEPT_STRIDE;
+ else
+ return 1 | VFCAP_OSD | VFCAP_SWSCALE | VFCAP_FLIP |
+ VFCAP_ACCEPT_STRIDE;
}
- switch( format )
- {
+ switch (format)
+ {
// case IMGFMT_BGR8:
// case IMGFMT_BGR15:
// case IMGFMT_BGR16:
@@ -594,82 +709,91 @@
// case IMGFMT_BGR32:
// return 0x2;
// case IMGFMT_YUY2:
- case IMGFMT_I420:
- case IMGFMT_IYUV:
- case IMGFMT_YV12:
- return 1|VFCAP_OSD|VFCAP_SWSCALE|VFCAP_ACCEPT_STRIDE;
- }
- return 0;
+ case IMGFMT_I420:
+ case IMGFMT_IYUV:
+ case IMGFMT_YV12:
+ return 1 | VFCAP_OSD | VFCAP_SWSCALE | VFCAP_ACCEPT_STRIDE;
+ }
+ return 0;
}
static void uninit(void)
{
- if(!myximage) return;
-
- freeMyXImage();
- saver_on(mDisplay); // screen saver back on
+ if (!myximage)
+ return;
+
+ freeMyXImage();
+ saver_on(mDisplay); // screen saver back on
#ifdef HAVE_XF86VM
- vo_vm_close(mDisplay);
+ vo_vm_close(mDisplay);
#endif
- zoomFlag=0;
- vo_x11_uninit();
+ zoomFlag = 0;
+ vo_x11_uninit();
- sws_freeContext(swsContext);
+ sws_freeContext(swsContext);
}
static uint32_t preinit(const char *arg)
{
- if(arg)
+ if (arg)
{
- mp_msg(MSGT_VO,MSGL_ERR,"vo_x11: Unknown subdevice: %s\n",arg);
- return ENOSYS;
+ mp_msg(MSGT_VO, MSGL_ERR, "vo_x11: Unknown subdevice: %s\n", arg);
+ return ENOSYS;
}
- if( !vo_init() ) return -1; // Can't open X11
+ if (!vo_init())
+ return -1; // Can't open X11
return 0;
}
static uint32_t control(uint32_t request, void *data, ...)
{
- switch (request) {
- case VOCTRL_PAUSE: return (int_pause=1);
- case VOCTRL_RESUME: return (int_pause=0);
- case VOCTRL_QUERY_FORMAT:
- return query_format(*((uint32_t*)data));
- case VOCTRL_GUISUPPORT:
- return VO_TRUE;
- case VOCTRL_GET_IMAGE:
- return get_image(data);
- case VOCTRL_SET_EQUALIZER:
- {
- va_list ap;
- int value;
- va_start(ap, data);
- value = va_arg(ap, int);
- va_end(ap);
- return vo_x11_set_equalizer(data, value);
- }
- case VOCTRL_GET_EQUALIZER:
- {
- va_list ap;
- int *value;
- va_start(ap, data);
- value = va_arg(ap, int *);
- va_end(ap);
- return vo_x11_get_equalizer(data, value);
- }
- case VOCTRL_ONTOP:
- vo_x11_ontop();
- return VO_TRUE;
- case VOCTRL_FULLSCREEN:
- {
- vo_x11_fullscreen();
- vo_x11_clearwindow(mDisplay, vo_window);
- }
- return VO_TRUE;
- }
- return VO_NOTIMPL;
+ switch (request)
+ {
+ case VOCTRL_PAUSE:
+ return (int_pause = 1);
+ case VOCTRL_RESUME:
+ return (int_pause = 0);
+ case VOCTRL_QUERY_FORMAT:
+ return query_format(*((uint32_t *) data));
+ case VOCTRL_GUISUPPORT:
+ return VO_TRUE;
+ case VOCTRL_GET_IMAGE:
+ return get_image(data);
+ case VOCTRL_SET_EQUALIZER:
+ {
+ va_list ap;
+ int value;
+
+ va_start(ap, data);
+ value = va_arg(ap, int);
+
+ va_end(ap);
+ return vo_x11_set_equalizer(data, value);
+ }
+ case VOCTRL_GET_EQUALIZER:
+ {
+ va_list ap;
+ int *value;
+
+ va_start(ap, data);
+ value = va_arg(ap, int *);
+
+ va_end(ap);
+ return vo_x11_get_equalizer(data, value);
+ }
+ case VOCTRL_ONTOP:
+ vo_x11_ontop();
+ return VO_TRUE;
+ case VOCTRL_FULLSCREEN:
+ {
+ vo_x11_fullscreen();
+ vo_x11_clearwindow(mDisplay, vo_window);
+ }
+ return VO_TRUE;
+ }
+ return VO_NOTIMPL;
}
Index: vo_xmga.c
===================================================================
RCS file: /cvsroot/mplayer/main/libvo/vo_xmga.c,v
retrieving revision 1.86
retrieving revision 1.87
diff -u -r1.86 -r1.87
--- vo_xmga.c 30 Nov 2003 16:36:10 -0000 1.86
+++ vo_xmga.c 14 Jun 2004 04:53:03 -0000 1.87
@@ -39,204 +39,259 @@
#ifdef SHOW_TIME
#include "../osdep/timer.h"
-static unsigned int timer=0;
-static unsigned int timerd=0;
+static unsigned int timer = 0;
+static unsigned int timerd = 0;
#endif
#ifdef HAVE_NEW_GUI
#include "../Gui/interface.h"
#endif
-static vo_info_t info =
-{
- "Matrox G200/G4x0/G550 overlay in X11 window (using /dev/mga_vid)",
- "xmga",
- "Zoltan Ponekker <pontscho at makacs.poliod.hu>",
- ""
+static vo_info_t info = {
+ "Matrox G200/G4x0/G550 overlay in X11 window (using /dev/mga_vid)",
+ "xmga",
+ "Zoltan Ponekker <pontscho at makacs.poliod.hu>",
+ ""
};
-LIBVO_EXTERN( xmga )
-
-
-static XGCValues wGCV;
+LIBVO_EXTERN(xmga)
+static XGCValues wGCV;
-static uint32_t mDepth;
-static XWindowAttributes attribs;
+static uint32_t mDepth;
+static XWindowAttributes attribs;
static int colorkey;
-static uint32_t mvHeight;
-static uint32_t mvWidth;
+static uint32_t mvHeight;
+static uint32_t mvWidth;
-static Window mRoot;
+static Window mRoot;
-static XSetWindowAttributes xWAttribs;
+static XSetWindowAttributes xWAttribs;
-static int inited=0;
+static int inited = 0;
#define VO_XMGA
#include "mga_common.c"
#undef VO_XMGA
-static void mDrawColorKey( void )
+static void mDrawColorKey(void)
{
- XSetBackground( mDisplay,vo_gc,0 );
- XClearWindow( mDisplay,vo_window );
- XSetForeground( mDisplay,vo_gc,colorkey );
- XFillRectangle( mDisplay,vo_window,vo_gc,drwX,drwY,drwWidth,(vo_fs?drwHeight - 1:drwHeight) );
- XFlush( mDisplay );
+ XSetBackground(mDisplay, vo_gc, 0);
+ XClearWindow(mDisplay, vo_window);
+ XSetForeground(mDisplay, vo_gc, colorkey);
+ XFillRectangle(mDisplay, vo_window, vo_gc, drwX, drwY, drwWidth,
+ (vo_fs ? drwHeight - 1 : drwHeight));
+ XFlush(mDisplay);
}
static void check_events(void)
{
- int e=vo_x11_check_events(mDisplay);
- if ( !(e&VO_EVENT_RESIZE) && !(e&VO_EVENT_EXPOSE) ) return;
- set_window();
- mDrawColorKey();
- if ( ioctl( f,MGA_VID_CONFIG,&mga_vid_config ) ) mp_msg(MSGT_VO,MSGL_WARN,"Error in mga_vid_config ioctl (wrong mga_vid.o version?)" );
+ int e = vo_x11_check_events(mDisplay);
+
+ if (!(e & VO_EVENT_RESIZE) && !(e & VO_EVENT_EXPOSE))
+ return;
+ set_window();
+ mDrawColorKey();
+ if (ioctl(f, MGA_VID_CONFIG, &mga_vid_config))
+ mp_msg(MSGT_VO, MSGL_WARN,
+ "Error in mga_vid_config ioctl (wrong mga_vid.o version?)");
}
-static void flip_page(void){
+static void flip_page(void)
+{
#ifdef SHOW_TIME
unsigned int t;
- t=GetTimer();
- mp_msg(MSGT_VO,MSGL_STATUS," [timer: %08X diff: %6d dd: %6d ] \n",t,t-timer,(t-timer)-timerd);
- timerd=t-timer;
- timer=t;
+
+ t = GetTimer();
+ mp_msg(MSGT_VO, MSGL_STATUS,
+ " [timer: %08X diff: %6d dd: %6d ] \n", t, t - timer,
+ (t - timer) - timerd);
+ timerd = t - timer;
+ timer = t;
#endif
- vo_mga_flip_page();
+ vo_mga_flip_page();
}
-static uint32_t config( uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint32_t flags, char *title, uint32_t format)
+static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width,
+ uint32_t d_height, uint32_t flags, char *title,
+ uint32_t format)
{
- char * mTitle=(title == NULL) ? "XMGA render" : title;
- XVisualInfo vinfo;
- unsigned long xswamask;
- int r, g, b;
-
- if(mga_init(width,height,format)) return -1; // ioctl errors?
-
- aspect_save_orig(width,height);
- aspect_save_prescale(d_width,d_height);
- aspect_save_screenres(vo_screenwidth,vo_screenheight);
-
- mvWidth=width; mvHeight=height;
-
- vo_panscan_x=vo_panscan_y=vo_panscan_amount=0;
-
- vo_dx=( vo_screenwidth - d_width ) / 2;
- vo_dy=( vo_screenheight - d_height ) / 2;
- geometry(&vo_dx, &vo_dy, &d_width, &d_height, vo_screenwidth, vo_screenheight);
- vo_dwidth=d_width; vo_dheight=d_height;
- vo_mouse_autohide=1;
-
- r = (vo_colorkey & 0x00ff0000) >> 16;
- g = (vo_colorkey & 0x0000ff00) >> 8;
- b = vo_colorkey & 0x000000ff;
- switch ( vo_depthonscreen )
- {
- case 32: colorkey = vo_colorkey; break;
- case 24: colorkey = vo_colorkey & 0x00ffffff; break;
- case 16: colorkey = ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3); break;
- case 15: colorkey = ((r >> 3) << 10) | ((g >> 3) << 5) | (b >> 3); break;
- default: mp_msg(MSGT_VO,MSGL_ERR,"Sorry, this (%d) color depth not supported.\n",vo_depthonscreen ); return -1;
- }
- mp_msg(MSGT_VO, MSGL_INFO, "Using colorkey: %x\n", colorkey);
+ char *mTitle = (title == NULL) ? "XMGA render" : title;
+ XVisualInfo vinfo;
+ unsigned long xswamask;
+ int r, g, b;
+
+ if (mga_init(width, height, format))
+ return -1; // ioctl errors?
+
+ aspect_save_orig(width, height);
+ aspect_save_prescale(d_width, d_height);
+ aspect_save_screenres(vo_screenwidth, vo_screenheight);
+
+ mvWidth = width;
+ mvHeight = height;
+
+ vo_panscan_x = vo_panscan_y = vo_panscan_amount = 0;
+
+ vo_dx = (vo_screenwidth - d_width) / 2;
+ vo_dy = (vo_screenheight - d_height) / 2;
+ geometry(&vo_dx, &vo_dy, &d_width, &d_height, vo_screenwidth,
+ vo_screenheight);
+ vo_dwidth = d_width;
+ vo_dheight = d_height;
+ vo_mouse_autohide = 1;
+
+ r = (vo_colorkey & 0x00ff0000) >> 16;
+ g = (vo_colorkey & 0x0000ff00) >> 8;
+ b = vo_colorkey & 0x000000ff;
+ switch (vo_depthonscreen)
+ {
+ case 32:
+ colorkey = vo_colorkey;
+ break;
+ case 24:
+ colorkey = vo_colorkey & 0x00ffffff;
+ break;
+ case 16:
+ colorkey = ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3);
+ break;
+ case 15:
+ colorkey = ((r >> 3) << 10) | ((g >> 3) << 5) | (b >> 3);
+ break;
+ default:
+ mp_msg(MSGT_VO, MSGL_ERR,
+ "Sorry, this (%d) color depth not supported.\n",
+ vo_depthonscreen);
+ return -1;
+ }
+ mp_msg(MSGT_VO, MSGL_INFO, "Using colorkey: %x\n", colorkey);
- inited=1;
+ inited = 1;
- aspect(&d_width,&d_height,A_NOZOOM);
+ aspect(&d_width, &d_height, A_NOZOOM);
#ifdef HAVE_NEW_GUI
- if(use_gui)
- guiGetEvent( guiSetShVideo,0 ); // the GUI will set up / resize the window
- else
+ if (use_gui)
+ guiGetEvent(guiSetShVideo, 0); // the GUI will set up / resize the window
+ else
#endif
- {
- if ( flags&1 ) aspect(&dwidth,&dheight,A_ZOOM);
+ {
+ if (flags & 1)
+ aspect(&dwidth, &dheight, A_ZOOM);
+
+ XGetWindowAttributes(mDisplay, mRootWin, &attribs);
+ mDepth = attribs.depth;
+ if (mDepth != 15 && mDepth != 16 && mDepth != 24 && mDepth != 32)
+ mDepth = 24;
+ XMatchVisualInfo(mDisplay, mScreen, mDepth, TrueColor, &vinfo);
+ xWAttribs.colormap =
+ XCreateColormap(mDisplay, mRootWin, vinfo.visual, AllocNone);
+ xWAttribs.background_pixel = 0;
+ xWAttribs.border_pixel = 0;
+ xWAttribs.event_mask =
+ StructureNotifyMask | ExposureMask | KeyPressMask |
+ ((WinID ==
+ 0) ? 0 : (ButtonPressMask | ButtonReleaseMask |
+ PointerMotionMask | PropertyChangeMask));
+ xswamask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask;
+
+ if (WinID >= 0)
+ {
+
+ vo_window = WinID ? ((Window) WinID) : mRootWin;
+ if (WinID)
+ {
+ XUnmapWindow(mDisplay, vo_window);
+ XChangeWindowAttributes(mDisplay, vo_window, xswamask,
+ &xWAttribs);
+ vo_x11_selectinput_witherr(mDisplay, vo_window,
+ StructureNotifyMask |
+ KeyPressMask |
+ PropertyChangeMask |
+ PointerMotionMask |
+ ButtonPressMask |
+ ButtonReleaseMask |
+ ExposureMask);
+ } else
+ XSelectInput(mDisplay, vo_window, ExposureMask);
+
+ } 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);
- XGetWindowAttributes( mDisplay,mRootWin,&attribs );
- mDepth=attribs.depth;
- if ( mDepth != 15 && mDepth != 16 && mDepth != 24 && mDepth != 32 ) mDepth=24;
- XMatchVisualInfo( mDisplay,mScreen,mDepth,TrueColor,&vinfo );
- xWAttribs.colormap=XCreateColormap( mDisplay,mRootWin,vinfo.visual,AllocNone );
- xWAttribs.background_pixel=0;
- xWAttribs.border_pixel=0;
- xWAttribs.event_mask=StructureNotifyMask | ExposureMask | KeyPressMask |
- ((WinID==0)?0:(ButtonPressMask | ButtonReleaseMask | PointerMotionMask | PropertyChangeMask));
- xswamask=CWBackPixel | CWBorderPixel | CWColormap | CWEventMask;
-
- if ( WinID>=0 ){
-
- vo_window = WinID ? ((Window)WinID) : mRootWin;
- if ( WinID )
- {
- XUnmapWindow( mDisplay,vo_window );
- XChangeWindowAttributes( mDisplay,vo_window,xswamask,&xWAttribs);
- vo_x11_selectinput_witherr( mDisplay,vo_window,StructureNotifyMask | KeyPressMask | PropertyChangeMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask | ExposureMask );
- } else XSelectInput( mDisplay,vo_window,ExposureMask );
-
- } 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 );
-
- if ( flags&1 ) vo_x11_fullscreen();
+ if (flags & 1)
+ vo_x11_fullscreen();
#ifdef HAVE_XINERAMA
- vo_x11_xinerama_move(mDisplay,vo_window);
+ vo_x11_xinerama_move(mDisplay, vo_window);
#endif
- } else if ( !(flags&1) ) XMoveResizeWindow( mDisplay,vo_window,vo_dx,vo_dy,vo_dwidth,vo_dheight );
- }
+ } else if (!(flags & 1))
+ XMoveResizeWindow(mDisplay, vo_window, vo_dx, vo_dy,
+ vo_dwidth, vo_dheight);
+ }
- if ( vo_gc != None ) XFreeGC( mDisplay,vo_gc );
- vo_gc=XCreateGC( mDisplay,vo_window,GCForeground,&wGCV );
+ if (vo_gc != None)
+ XFreeGC(mDisplay, vo_gc);
+ vo_gc = XCreateGC(mDisplay, vo_window, GCForeground, &wGCV);
- } // !GUI
+ } // !GUI
- if ( ( flags&1 )&&( !WinID ) ) { vo_dx=0; vo_dy=0; vo_dwidth=vo_screenwidth; vo_dheight=vo_screenheight; vo_fs=1; }
+ if ((flags & 1) && (!WinID))
+ {
+ vo_dx = 0;
+ vo_dy = 0;
+ vo_dwidth = vo_screenwidth;
+ vo_dheight = vo_screenheight;
+ vo_fs = 1;
+ }
- panscan_calc();
+ panscan_calc();
- mga_vid_config.colkey_on=1;
- mga_vid_config.colkey_red=r;
- mga_vid_config.colkey_green=g;
- mga_vid_config.colkey_blue=b;
+ mga_vid_config.colkey_on = 1;
+ mga_vid_config.colkey_red = r;
+ mga_vid_config.colkey_green = g;
+ mga_vid_config.colkey_blue = b;
- set_window(); // set up mga_vid_config.dest_width etc
+ set_window(); // set up mga_vid_config.dest_width etc
- saver_off(mDisplay);
+ saver_off(mDisplay);
- if (vo_ontop) vo_x11_setlayer(mDisplay, vo_window, vo_ontop);
+ if (vo_ontop)
+ vo_x11_setlayer(mDisplay, vo_window, vo_ontop);
- XFlush( mDisplay );
- XSync( mDisplay,False );
-
- ioctl(f,MGA_VID_ON,0);
+ XFlush(mDisplay);
+ XSync(mDisplay, False);
- return 0;
-}
+ ioctl(f, MGA_VID_ON, 0);
-static void uninit(void){
- mp_msg(MSGT_VO,MSGL_V,"vo: uninit!\n");
- mga_uninit();
- if(!inited) return; // no window?
- inited=0;
- saver_on(mDisplay);
- vo_x11_uninit(); // destroy the window
+ return 0;
}
+static void uninit(void)
+{
+ mp_msg(MSGT_VO, MSGL_V, "vo: uninit!\n");
+ mga_uninit();
+ if (!inited)
+ return; // no window?
+ inited = 0;
+ saver_on(mDisplay);
+ vo_x11_uninit(); // destroy the window
+}
Index: vo_xv.c
===================================================================
RCS file: /cvsroot/mplayer/main/libvo/vo_xv.c,v
retrieving revision 1.151
retrieving revision 1.152
diff -u -r1.151 -r1.152
--- vo_xv.c 30 Nov 2003 16:36:10 -0000 1.151
+++ vo_xv.c 14 Jun 2004 04:53:03 -0000 1.152
@@ -40,23 +40,20 @@
#include "../Gui/interface.h"
#endif
-static vo_info_t info =
-{
- "X11/Xv",
- "xv",
- "Gerd Knorr <kraxel at goldbach.in-berlin.de> and others",
- ""
+static vo_info_t info = {
+ "X11/Xv",
+ "xv",
+ "Gerd Knorr <kraxel at goldbach.in-berlin.de> and others",
+ ""
};
LIBVO_EXTERN(xv)
-
#ifdef HAVE_SHM
#include <sys/ipc.h>
#include <sys/shm.h>
#include <X11/extensions/XShm.h>
-
/* since it doesn't seem to be defined on some platforms */
-int XShmGetEventBase(Display*);
+int XShmGetEventBase(Display *);
static XShmSegmentInfo Shminfo[NUM_BUFFERS];
static int Shmem_Flag;
@@ -68,15 +65,15 @@
// FIXME: dynamically allocate this stuff
static void allocate_xvimage(int);
-static unsigned int ver,rel,req,ev,err;
+static unsigned int ver, rel, req, ev, err;
static unsigned int formats, adaptors, xv_port, xv_format;
-static XvAdaptorInfo *ai = NULL;
-static XvImageFormatValues *fo;
+static XvAdaptorInfo *ai = NULL;
+static XvImageFormatValues *fo;
-static int current_buf=0;
-static int current_ip_buf=0;
-static int num_buffers=1; // default
-static XvImage* xvimage[NUM_BUFFERS];
+static int current_buf = 0;
+static int current_ip_buf = 0;
+static int num_buffers = 1; // default
+static XvImage *xvimage[NUM_BUFFERS];
static uint32_t image_width;
@@ -86,34 +83,54 @@
static int int_pause;
-static Window mRoot;
-static uint32_t drwX,drwY,drwBorderWidth,drwDepth;
-static uint32_t dwidth,dheight;
-
-static void (*draw_alpha_fnc)(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride);
-
-static void draw_alpha_yv12(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){
- x0+=image_width*(vo_panscan_x>>1)/(vo_dwidth+vo_panscan_x);
- vo_draw_alpha_yv12(w,h,src,srca,stride,
- xvimage[current_buf]->data+xvimage[current_buf]->offsets[0]+
- xvimage[current_buf]->pitches[0]*y0+x0,xvimage[current_buf]->pitches[0]);
-}
-
-static void draw_alpha_yuy2(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){
- x0+=image_width*(vo_panscan_x>>1)/(vo_dwidth+vo_panscan_x);
- vo_draw_alpha_yuy2(w,h,src,srca,stride,
- xvimage[current_buf]->data+xvimage[current_buf]->offsets[0]+
- xvimage[current_buf]->pitches[0]*y0+2*x0,xvimage[current_buf]->pitches[0]);
-}
-
-static void draw_alpha_uyvy(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){
- x0+=image_width*(vo_panscan_x>>1)/(vo_dwidth+vo_panscan_x);
- vo_draw_alpha_yuy2(w,h,src,srca,stride,
- xvimage[current_buf]->data+xvimage[current_buf]->offsets[0]+
- xvimage[current_buf]->pitches[0]*y0+2*x0+1,xvimage[current_buf]->pitches[0]);
-}
-
-static void draw_alpha_null(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){
+static Window mRoot;
+static uint32_t drwX, drwY, drwBorderWidth, drwDepth;
+static uint32_t dwidth, dheight;
+
+static void (*draw_alpha_fnc) (int x0, int y0, int w, int h,
+ unsigned char *src, unsigned char *srca,
+ int stride);
+
+static void draw_alpha_yv12(int x0, int y0, int w, int h,
+ unsigned char *src, unsigned char *srca,
+ int stride)
+{
+ x0 += image_width * (vo_panscan_x >> 1) / (vo_dwidth + vo_panscan_x);
+ vo_draw_alpha_yv12(w, h, src, srca, stride,
+ xvimage[current_buf]->data +
+ xvimage[current_buf]->offsets[0] +
+ xvimage[current_buf]->pitches[0] * y0 + x0,
+ xvimage[current_buf]->pitches[0]);
+}
+
+static void draw_alpha_yuy2(int x0, int y0, int w, int h,
+ unsigned char *src, unsigned char *srca,
+ int stride)
+{
+ x0 += image_width * (vo_panscan_x >> 1) / (vo_dwidth + vo_panscan_x);
+ vo_draw_alpha_yuy2(w, h, src, srca, stride,
+ xvimage[current_buf]->data +
+ xvimage[current_buf]->offsets[0] +
+ xvimage[current_buf]->pitches[0] * y0 + 2 * x0,
+ xvimage[current_buf]->pitches[0]);
+}
+
+static void draw_alpha_uyvy(int x0, int y0, int w, int h,
+ unsigned char *src, unsigned char *srca,
+ int stride)
+{
+ x0 += image_width * (vo_panscan_x >> 1) / (vo_dwidth + vo_panscan_x);
+ vo_draw_alpha_yuy2(w, h, src, srca, stride,
+ xvimage[current_buf]->data +
+ xvimage[current_buf]->offsets[0] +
+ xvimage[current_buf]->pitches[0] * y0 + 2 * x0 + 1,
+ xvimage[current_buf]->pitches[0]);
+}
+
+static void draw_alpha_null(int x0, int y0, int w, int h,
+ unsigned char *src, unsigned char *srca,
+ int stride)
+{
}
@@ -123,451 +140,605 @@
* connect to server, create and map window,
* allocate colors and (shared) memory
*/
-static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint32_t flags, char *title, uint32_t format)
+static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width,
+ uint32_t d_height, uint32_t flags, char *title,
+ uint32_t format)
{
// int screen;
- char *hello = (title == NULL) ? "Xv render" : title;
+ char *hello = (title == NULL) ? "Xv render" : title;
+
// char *name = ":0.0";
- XSizeHints hint;
- XVisualInfo vinfo;
- XGCValues xgcv;
- XSetWindowAttributes xswa;
- XWindowAttributes attribs;
- unsigned long xswamask;
- int depth;
+ XSizeHints hint;
+ XVisualInfo vinfo;
+ XGCValues xgcv;
+ XSetWindowAttributes xswa;
+ XWindowAttributes attribs;
+ unsigned long xswamask;
+ int depth;
+
#ifdef HAVE_XF86VM
- int vm=0;
- unsigned int modeline_width, modeline_height;
- static uint32_t vm_width;
- static uint32_t vm_height;
+ int vm = 0;
+ unsigned int modeline_width, modeline_height;
+ static uint32_t vm_width;
+ static uint32_t vm_height;
#endif
- panscan_init();
+ panscan_init();
- aspect_save_orig(width,height);
- aspect_save_prescale(d_width,d_height);
+ aspect_save_orig(width, height);
+ aspect_save_prescale(d_width, d_height);
- image_height = height;
- image_width = width;
- image_format=format;
-
- vo_mouse_autohide=1;
+ image_height = height;
+ image_width = width;
+ image_format = format;
- int_pause=0;
+ vo_mouse_autohide = 1;
+
+ int_pause = 0;
+
+ vo_dx = (vo_screenwidth - d_width) / 2;
+ vo_dy = (vo_screenheight - d_height) / 2;
+ geometry(&vo_dx, &vo_dy, &d_width, &d_height, vo_screenwidth,
+ vo_screenheight);
+ vo_dwidth = d_width;
+ vo_dheight = d_height;
- vo_dx=( vo_screenwidth - d_width ) / 2; vo_dy=( vo_screenheight - d_height ) / 2;
- geometry(&vo_dx, &vo_dy, &d_width, &d_height, vo_screenwidth, vo_screenheight);
- vo_dwidth=d_width; vo_dheight=d_height;
-
#ifdef HAVE_XF86VM
- if( flags&0x02 ) vm = 1;
+ if (flags & 0x02)
+ vm = 1;
#endif
- flip_flag=flags&8;
- num_buffers=vo_doublebuffering?(vo_directrendering?NUM_BUFFERS:2):1;
+ flip_flag = flags & 8;
+ num_buffers =
+ vo_doublebuffering ? (vo_directrendering ? NUM_BUFFERS : 2) : 1;
- /* check image formats */
- {
- unsigned int i;
-
- xv_format=0;
- for(i = 0; i < formats; i++){
- mp_msg(MSGT_VO,MSGL_V,"Xvideo image format: 0x%x (%4.4s) %s\n", fo[i].id,(char*)&fo[i].id, (fo[i].format == XvPacked) ? "packed" : "planar");
- if (fo[i].id == format) xv_format = fo[i].id;
- }
- if (!xv_format) return -1;
- }
- aspect_save_screenres(vo_screenwidth,vo_screenheight);
+ /* check image formats */
+ {
+ unsigned int i;
+
+ xv_format = 0;
+ for (i = 0; i < formats; i++)
+ {
+ mp_msg(MSGT_VO, MSGL_V,
+ "Xvideo image format: 0x%x (%4.4s) %s\n", fo[i].id,
+ (char *) &fo[i].id,
+ (fo[i].format == XvPacked) ? "packed" : "planar");
+ if (fo[i].id == format)
+ xv_format = fo[i].id;
+ }
+ if (!xv_format)
+ return -1;
+ }
+ aspect_save_screenres(vo_screenwidth, vo_screenheight);
#ifdef HAVE_NEW_GUI
- if(use_gui)
- guiGetEvent( guiSetShVideo,0 ); // let the GUI to setup/resize our window
- else
-#endif
- {
- hint.x = vo_dx;
- hint.y = vo_dy;
- aspect(&d_width,&d_height,A_NOZOOM);
- hint.width = d_width;
- hint.height = d_height;
-#ifdef HAVE_XF86VM
- if ( vm )
- {
- if ((d_width==0) && (d_height==0))
- { vm_width=image_width; vm_height=image_height; }
- else
- { vm_width=d_width; vm_height=d_height; }
- vo_vm_switch(vm_width, vm_height,&modeline_width, &modeline_height);
- hint.x=(vo_screenwidth-modeline_width)/2;
- hint.y=(vo_screenheight-modeline_height)/2;
- hint.width=modeline_width;
- hint.height=modeline_height;
- aspect_save_screenres(modeline_width,modeline_height);
- }
+ if (use_gui)
+ guiGetEvent(guiSetShVideo, 0); // let the GUI to setup/resize our window
else
#endif
- if ( vo_fs )
{
+ hint.x = vo_dx;
+ hint.y = vo_dy;
+ aspect(&d_width, &d_height, A_NOZOOM);
+ hint.width = d_width;
+ hint.height = d_height;
+#ifdef HAVE_XF86VM
+ if (vm)
+ {
+ if ((d_width == 0) && (d_height == 0))
+ {
+ vm_width = image_width;
+ vm_height = image_height;
+ } else
+ {
+ vm_width = d_width;
+ vm_height = d_height;
+ }
+ vo_vm_switch(vm_width, vm_height, &modeline_width,
+ &modeline_height);
+ hint.x = (vo_screenwidth - modeline_width) / 2;
+ hint.y = (vo_screenheight - modeline_height) / 2;
+ hint.width = modeline_width;
+ hint.height = modeline_height;
+ aspect_save_screenres(modeline_width, modeline_height);
+ } else
+#endif
+ if (vo_fs)
+ {
#ifdef X11_FULLSCREEN
- /* this code replaces X11_FULLSCREEN hack in mplayer.c
- * aspect() is available through aspect.h for all vos.
- * besides zooming should only be done with -zoom,
- * but I leave the old -fs behaviour so users don't get
- * irritated for now (and send lots o' mails ;) ::atmos
- */
+ /* this code replaces X11_FULLSCREEN hack in mplayer.c
+ * aspect() is available through aspect.h for all vos.
+ * besides zooming should only be done with -zoom,
+ * but I leave the old -fs behaviour so users don't get
+ * irritated for now (and send lots o' mails ;) ::atmos
+ */
- aspect(&d_width,&d_height,A_ZOOM);
+ aspect(&d_width, &d_height, A_ZOOM);
#endif
- }
+ }
// dwidth=d_width; dheight=d_height; //XXX: what are the copy vars used for?
- vo_dwidth=d_width; vo_dheight=d_height;
- hint.flags = PPosition | PSize /* | PBaseSize */;
- hint.base_width = hint.width; hint.base_height = hint.height;
- XGetWindowAttributes(mDisplay, DefaultRootWindow(mDisplay), &attribs);
- depth=attribs.depth;
- if (depth != 15 && depth != 16 && depth != 24 && depth != 32) depth = 24;
- XMatchVisualInfo(mDisplay, mScreen, depth, TrueColor, &vinfo);
-
- xswa.background_pixel = 0;
- xswa.border_pixel = 0;
- xswamask = CWBackPixel | CWBorderPixel;
-
- if ( WinID>=0 ){
- vo_window = WinID ? ((Window)WinID) : mRootWin;
- if ( WinID )
- {
- XUnmapWindow( mDisplay,vo_window );
- XChangeWindowAttributes( mDisplay,vo_window,xswamask,&xswa );
- vo_x11_selectinput_witherr( mDisplay,vo_window,StructureNotifyMask | KeyPressMask | PropertyChangeMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask | ExposureMask );
- XMapWindow( mDisplay,vo_window );
- } else { drwX=vo_dx; drwY=vo_dy; }
- } 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);
-
- 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);
- XSetWMNormalHints( mDisplay,vo_window,&hint );
- XMapWindow(mDisplay, vo_window);
- if ( flags&1 ) vo_x11_fullscreen();
- else {
+ vo_dwidth = d_width;
+ vo_dheight = d_height;
+ hint.flags = PPosition | PSize /* | PBaseSize */ ;
+ hint.base_width = hint.width;
+ hint.base_height = hint.height;
+ XGetWindowAttributes(mDisplay, DefaultRootWindow(mDisplay),
+ &attribs);
+ depth = attribs.depth;
+ if (depth != 15 && depth != 16 && depth != 24 && depth != 32)
+ depth = 24;
+ XMatchVisualInfo(mDisplay, mScreen, depth, TrueColor, &vinfo);
+
+ xswa.background_pixel = 0;
+ xswa.border_pixel = 0;
+ xswamask = CWBackPixel | CWBorderPixel;
+
+ if (WinID >= 0)
+ {
+ vo_window = WinID ? ((Window) WinID) : mRootWin;
+ if (WinID)
+ {
+ XUnmapWindow(mDisplay, vo_window);
+ XChangeWindowAttributes(mDisplay, vo_window, xswamask,
+ &xswa);
+ vo_x11_selectinput_witherr(mDisplay, vo_window,
+ StructureNotifyMask |
+ KeyPressMask |
+ PropertyChangeMask |
+ PointerMotionMask |
+ ButtonPressMask |
+ ButtonReleaseMask |
+ ExposureMask);
+ XMapWindow(mDisplay, vo_window);
+ } else
+ {
+ drwX = vo_dx;
+ drwY = vo_dy;
+ }
+ } 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);
+
+ 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);
+ XSetWMNormalHints(mDisplay, vo_window, &hint);
+ XMapWindow(mDisplay, vo_window);
+ if (flags & 1)
+ vo_x11_fullscreen();
+ else
+ {
#ifdef HAVE_XINERAMA
- vo_x11_xinerama_move(mDisplay,vo_window);
+ vo_x11_xinerama_move(mDisplay, vo_window);
#endif
- 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 );
- if ( !vo_fs ) XMoveResizeWindow( mDisplay,vo_window,hint.x,hint.y,hint.width,hint.height );
- if ( flags&1 && !vo_fs ) vo_x11_fullscreen(); // handle -fs on non-first file
- }
-
+ 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);
+ if (!vo_fs)
+ XMoveResizeWindow(mDisplay, vo_window, hint.x, hint.y,
+ hint.width, hint.height);
+ if (flags & 1 && !vo_fs)
+ vo_x11_fullscreen(); // handle -fs on non-first file
+ }
+
// 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);
- XFlush(mDisplay);
- XSync(mDisplay, False);
+
+ if (vo_gc != None)
+ XFreeGC(mDisplay, vo_gc);
+ vo_gc = XCreateGC(mDisplay, vo_window, 0L, &xgcv);
+ XFlush(mDisplay);
+ XSync(mDisplay, False);
#ifdef HAVE_XF86VM
- if ( vm )
- {
- /* Grab the mouse pointer in our window */
- if(vo_grabpointer)
- XGrabPointer(mDisplay, vo_window, True, 0,
- GrabModeAsync, GrabModeAsync,
- vo_window, None, CurrentTime);
- XSetInputFocus(mDisplay, vo_window, RevertToNone, CurrentTime);
- }
-#endif
- }
-
- mp_msg(MSGT_VO,MSGL_V, "using Xvideo port %d for hw scaling\n",xv_port );
-
- switch (xv_format){
- case IMGFMT_YV12:
- case IMGFMT_I420:
- case IMGFMT_IYUV: draw_alpha_fnc=draw_alpha_yv12; break;
- case IMGFMT_YUY2:
- case IMGFMT_YVYU: draw_alpha_fnc=draw_alpha_yuy2; break;
- case IMGFMT_UYVY: draw_alpha_fnc=draw_alpha_uyvy; break;
- default: draw_alpha_fnc=draw_alpha_null;
- }
-
- if ( vo_config_count )
- for(current_buf=0;current_buf<num_buffers;++current_buf)
- deallocate_xvimage(current_buf);
+ if (vm)
+ {
+ /* Grab the mouse pointer in our window */
+ if (vo_grabpointer)
+ XGrabPointer(mDisplay, vo_window, True, 0,
+ GrabModeAsync, GrabModeAsync,
+ vo_window, None, CurrentTime);
+ XSetInputFocus(mDisplay, vo_window, RevertToNone, CurrentTime);
+ }
+#endif
+ }
- for(current_buf=0;current_buf<num_buffers;++current_buf)
- allocate_xvimage(current_buf);
+ mp_msg(MSGT_VO, MSGL_V, "using Xvideo port %d for hw scaling\n",
+ xv_port);
+
+ switch (xv_format)
+ {
+ case IMGFMT_YV12:
+ case IMGFMT_I420:
+ case IMGFMT_IYUV:
+ draw_alpha_fnc = draw_alpha_yv12;
+ break;
+ case IMGFMT_YUY2:
+ case IMGFMT_YVYU:
+ draw_alpha_fnc = draw_alpha_yuy2;
+ break;
+ case IMGFMT_UYVY:
+ draw_alpha_fnc = draw_alpha_uyvy;
+ break;
+ default:
+ draw_alpha_fnc = draw_alpha_null;
+ }
+
+ if (vo_config_count)
+ for (current_buf = 0; current_buf < num_buffers; ++current_buf)
+ deallocate_xvimage(current_buf);
- current_buf=0;
- current_ip_buf=0;
+ for (current_buf = 0; current_buf < num_buffers; ++current_buf)
+ allocate_xvimage(current_buf);
+
+ current_buf = 0;
+ current_ip_buf = 0;
#if 0
- set_gamma_correction();
+ set_gamma_correction();
#endif
- aspect(&vo_dwidth,&vo_dheight,A_NOZOOM);
- if ( (( flags&1 )&&( WinID <= 0 )) || vo_fs )
- {
- aspect(&vo_dwidth,&vo_dheight,A_ZOOM);
- drwX=( vo_screenwidth - (vo_dwidth > vo_screenwidth?vo_screenwidth:vo_dwidth) ) / 2;
- drwY=( vo_screenheight - (vo_dheight > vo_screenheight?vo_screenheight:vo_dheight) ) / 2;
- vo_dwidth=(vo_dwidth > vo_screenwidth?vo_screenwidth:vo_dwidth);
- vo_dheight=(vo_dheight > vo_screenheight?vo_screenheight:vo_dheight);
- mp_msg(MSGT_VO,MSGL_V, "[xv-fs] dx: %d dy: %d dw: %d dh: %d\n",drwX,drwY,vo_dwidth,vo_dheight );
- }
+ aspect(&vo_dwidth, &vo_dheight, A_NOZOOM);
+ if (((flags & 1) && (WinID <= 0)) || vo_fs)
+ {
+ aspect(&vo_dwidth, &vo_dheight, A_ZOOM);
+ drwX =
+ (vo_screenwidth -
+ (vo_dwidth >
+ vo_screenwidth ? vo_screenwidth : vo_dwidth)) / 2;
+ drwY =
+ (vo_screenheight -
+ (vo_dheight >
+ vo_screenheight ? vo_screenheight : vo_dheight)) / 2;
+ vo_dwidth =
+ (vo_dwidth > vo_screenwidth ? vo_screenwidth : vo_dwidth);
+ vo_dheight =
+ (vo_dheight > vo_screenheight ? vo_screenheight : vo_dheight);
+ mp_msg(MSGT_VO, MSGL_V, "[xv-fs] dx: %d dy: %d dw: %d dh: %d\n",
+ drwX, drwY, vo_dwidth, vo_dheight);
+ }
- panscan_calc();
+ panscan_calc();
- XClearWindow(mDisplay, vo_window);
+ XClearWindow(mDisplay, vo_window);
#if 0
#ifdef HAVE_SHM
- if ( Shmem_Flag )
- {
- XvShmPutImage(mDisplay, xv_port, vo_window, vo_gc, xvimage[current_buf], 0, 0, image_width, image_height, drwX, drwY, 1, 1, False);
- XvShmPutImage(mDisplay, xv_port, vo_window, vo_gc, xvimage[current_buf], 0, 0, image_width, image_height, drwX,drwY,vo_dwidth,(vo_fs?vo_dheight - 1:vo_dheight), False);
- }
- else
-#endif
- {
- XvPutImage(mDisplay, xv_port, vo_window, vo_gc, xvimage[current_buf], 0, 0, image_width, image_height, drwX, drwY, 1, 1);
- XvPutImage(mDisplay, xv_port, vo_window, vo_gc, xvimage[current_buf], 0, 0, image_width, image_height, drwX,drwY,vo_dwidth,(vo_fs?vo_dheight - 1:vo_dheight));
- }
+ if (Shmem_Flag)
+ {
+ XvShmPutImage(mDisplay, xv_port, vo_window, vo_gc,
+ xvimage[current_buf], 0, 0, image_width,
+ image_height, drwX, drwY, 1, 1, False);
+ XvShmPutImage(mDisplay, xv_port, vo_window, vo_gc,
+ xvimage[current_buf], 0, 0, image_width,
+ image_height, drwX, drwY, vo_dwidth,
+ (vo_fs ? vo_dheight - 1 : vo_dheight), False);
+ } else
#endif
-
- mp_msg(MSGT_VO,MSGL_V, "[xv] dx: %d dy: %d dw: %d dh: %d\n",drwX,drwY,vo_dwidth,vo_dheight );
+ {
+ XvPutImage(mDisplay, xv_port, vo_window, vo_gc,
+ xvimage[current_buf], 0, 0, image_width, image_height,
+ drwX, drwY, 1, 1);
+ XvPutImage(mDisplay, xv_port, vo_window, vo_gc,
+ xvimage[current_buf], 0, 0, image_width, image_height,
+ drwX, drwY, vo_dwidth,
+ (vo_fs ? vo_dheight - 1 : vo_dheight));
+ }
+#endif
+
+ mp_msg(MSGT_VO, MSGL_V, "[xv] dx: %d dy: %d dw: %d dh: %d\n", drwX,
+ drwY, vo_dwidth, vo_dheight);
- saver_off(mDisplay); // turning off screen saver
+ saver_off(mDisplay); // turning off screen saver
- if (vo_ontop) vo_x11_setlayer(mDisplay, vo_window, vo_ontop);
+ if (vo_ontop)
+ vo_x11_setlayer(mDisplay, vo_window, vo_ontop);
- return 0;
+ return 0;
}
static void allocate_xvimage(int foo)
{
- /*
- * allocate XvImages. FIXME: no error checking, without
- * mit-shm this will bomb... trzing to fix ::atmos
- */
+ /*
+ * allocate XvImages. FIXME: no error checking, without
+ * mit-shm this will bomb... trzing to fix ::atmos
+ */
#ifdef HAVE_SHM
- if ( mLocalDisplay && XShmQueryExtension( mDisplay ) ) Shmem_Flag = 1;
- else
- {
- Shmem_Flag = 0;
- mp_msg(MSGT_VO,MSGL_INFO, "Shared memory not supported\nReverting to normal Xv\n" );
- }
- if ( Shmem_Flag )
- {
- xvimage[foo] = (XvImage *) XvShmCreateImage(mDisplay, xv_port, xv_format, NULL, image_width, image_height, &Shminfo[foo]);
-
- Shminfo[foo].shmid = shmget(IPC_PRIVATE, xvimage[foo]->data_size, IPC_CREAT | 0777);
- Shminfo[foo].shmaddr = (char *) shmat(Shminfo[foo].shmid, 0, 0);
- Shminfo[foo].readOnly = False;
-
- xvimage[foo]->data = Shminfo[foo].shmaddr;
- XShmAttach(mDisplay, &Shminfo[foo]);
- XSync(mDisplay, False);
- shmctl(Shminfo[foo].shmid, IPC_RMID, 0);
- }
- else
-#endif
- {
- xvimage[foo] = (XvImage *) XvCreateImage(mDisplay, xv_port, xv_format, NULL, image_width, image_height);
- xvimage[foo]->data = malloc(xvimage[foo]->data_size);
- XSync(mDisplay,False);
- }
- memset(xvimage[foo]->data,128,xvimage[foo]->data_size);
- return;
+ if (mLocalDisplay && XShmQueryExtension(mDisplay))
+ Shmem_Flag = 1;
+ else
+ {
+ Shmem_Flag = 0;
+ mp_msg(MSGT_VO, MSGL_INFO,
+ "Shared memory not supported\nReverting to normal Xv\n");
+ }
+ if (Shmem_Flag)
+ {
+ xvimage[foo] =
+ (XvImage *) XvShmCreateImage(mDisplay, xv_port, xv_format,
+ NULL, image_width, image_height,
+ &Shminfo[foo]);
+
+ Shminfo[foo].shmid =
+ shmget(IPC_PRIVATE, xvimage[foo]->data_size, IPC_CREAT | 0777);
+ Shminfo[foo].shmaddr = (char *) shmat(Shminfo[foo].shmid, 0, 0);
+ Shminfo[foo].readOnly = False;
+
+ xvimage[foo]->data = Shminfo[foo].shmaddr;
+ XShmAttach(mDisplay, &Shminfo[foo]);
+ XSync(mDisplay, False);
+ shmctl(Shminfo[foo].shmid, IPC_RMID, 0);
+ } else
+#endif
+ {
+ xvimage[foo] =
+ (XvImage *) XvCreateImage(mDisplay, xv_port, xv_format, NULL,
+ image_width, image_height);
+ xvimage[foo]->data = malloc(xvimage[foo]->data_size);
+ XSync(mDisplay, False);
+ }
+ memset(xvimage[foo]->data, 128, xvimage[foo]->data_size);
+ return;
}
static void deallocate_xvimage(int foo)
{
#ifdef HAVE_SHM
- if ( Shmem_Flag )
- {
- XShmDetach( mDisplay,&Shminfo[foo] );
- shmdt( Shminfo[foo].shmaddr );
- }
- else
-#endif
- {
- free(xvimage[foo]->data);
- }
- XFree(xvimage[foo]);
-
- XFlush( mDisplay );
- XSync(mDisplay, False);
- return;
+ if (Shmem_Flag)
+ {
+ XShmDetach(mDisplay, &Shminfo[foo]);
+ shmdt(Shminfo[foo].shmaddr);
+ } else
+#endif
+ {
+ free(xvimage[foo]->data);
+ }
+ XFree(xvimage[foo]);
+
+ XFlush(mDisplay);
+ XSync(mDisplay, False);
+ return;
}
static void check_events(void)
{
- int e=vo_x11_check_events(mDisplay);
+ int e = vo_x11_check_events(mDisplay);
- if (e&VO_EVENT_EXPOSE && vo_fs)
- vo_x11_clearwindow(mDisplay, vo_window);
+ if (e & VO_EVENT_EXPOSE && vo_fs)
+ vo_x11_clearwindow(mDisplay, vo_window);
- if(e&VO_EVENT_RESIZE)
- {
- if (vo_fs) {
- e |= VO_EVENT_EXPOSE;
- XClearWindow(mDisplay, vo_window);
- XFlush(mDisplay);
- }
-
- XGetGeometry( mDisplay,vo_window,&mRoot,&drwX,&drwY,&vo_dwidth,&vo_dheight,&drwBorderWidth,&drwDepth );
- drwX = drwY = 0;
- mp_msg(MSGT_VO,MSGL_V, "[xv] dx: %d dy: %d dw: %d dh: %d\n",drwX,drwY,vo_dwidth,vo_dheight );
-
- aspect(&dwidth,&dheight,A_NOZOOM);
- if ( vo_fs )
- {
- aspect(&dwidth,&dheight,A_ZOOM);
- drwX=( vo_screenwidth - (dwidth > vo_screenwidth?vo_screenwidth:dwidth) ) / 2;
- drwY=( vo_screenheight - (dheight > vo_screenheight?vo_screenheight:dheight) ) / 2;
- vo_dwidth=(dwidth > vo_screenwidth?vo_screenwidth:dwidth);
- vo_dheight=(dheight > vo_screenheight?vo_screenheight:dheight);
- mp_msg(MSGT_VO,MSGL_V, "[xv-fs] dx: %d dy: %d dw: %d dh: %d\n",drwX,drwY,vo_dwidth,vo_dheight );
+ if (e & VO_EVENT_RESIZE)
+ {
+ if (vo_fs)
+ {
+ e |= VO_EVENT_EXPOSE;
+ XClearWindow(mDisplay, vo_window);
+ XFlush(mDisplay);
+ }
+
+ XGetGeometry(mDisplay, vo_window, &mRoot, &drwX, &drwY, &vo_dwidth,
+ &vo_dheight, &drwBorderWidth, &drwDepth);
+ drwX = drwY = 0;
+ mp_msg(MSGT_VO, MSGL_V, "[xv] dx: %d dy: %d dw: %d dh: %d\n", drwX,
+ drwY, vo_dwidth, vo_dheight);
+
+ aspect(&dwidth, &dheight, A_NOZOOM);
+ if (vo_fs)
+ {
+ aspect(&dwidth, &dheight, A_ZOOM);
+ drwX =
+ (vo_screenwidth -
+ (dwidth > vo_screenwidth ? vo_screenwidth : dwidth)) / 2;
+ drwY =
+ (vo_screenheight -
+ (dheight >
+ vo_screenheight ? vo_screenheight : dheight)) / 2;
+ vo_dwidth =
+ (dwidth > vo_screenwidth ? vo_screenwidth : dwidth);
+ vo_dheight =
+ (dheight > vo_screenheight ? vo_screenheight : dheight);
+ mp_msg(MSGT_VO, MSGL_V,
+ "[xv-fs] dx: %d dy: %d dw: %d dh: %d\n", drwX, drwY,
+ vo_dwidth, vo_dheight);
+ }
}
- }
- if ( (e&VO_EVENT_EXPOSE || e&VO_EVENT_RESIZE) && int_pause)
- flip_page();
+ if ((e & VO_EVENT_EXPOSE || e & VO_EVENT_RESIZE) && int_pause)
+ flip_page();
}
static void draw_osd(void)
-{ vo_draw_text(image_width-image_width*vo_panscan_x/(vo_dwidth+vo_panscan_x),image_height,draw_alpha_fnc);}
-
-static void flip_page(void)
{
-
-#ifdef HAVE_SHM
- if ( Shmem_Flag )
- {
- XvShmPutImage(mDisplay, xv_port, vo_window, vo_gc, xvimage[current_buf],
- 0, 0, image_width, image_height,
- drwX-(vo_panscan_x>>1),drwY-(vo_panscan_y>>1),vo_dwidth+vo_panscan_x,(vo_fs?vo_dheight - 1:vo_dheight)+vo_panscan_y,
- False);
- }
- else
-#endif
- {
- XvPutImage(mDisplay, xv_port, vo_window, vo_gc, xvimage[current_buf],
- 0, 0, image_width, image_height,
- drwX-(vo_panscan_x>>1),drwY-(vo_panscan_y>>1),vo_dwidth+vo_panscan_x,(vo_fs?vo_dheight - 1:vo_dheight)+vo_panscan_y);
- }
- if (num_buffers>1){
- current_buf=vo_directrendering?0:((current_buf+1)%num_buffers);
- XFlush(mDisplay);
- } else
- XSync(mDisplay, False);
- return;
+ vo_draw_text(image_width -
+ image_width * vo_panscan_x / (vo_dwidth + vo_panscan_x),
+ image_height, draw_alpha_fnc);
}
-static uint32_t draw_slice(uint8_t *image[], int stride[], int w,int h,int x,int y)
+static void flip_page(void)
{
- uint8_t *dst;
- dst = xvimage[current_buf]->data + xvimage[current_buf]->offsets[0] +
- xvimage[current_buf]->pitches[0]*y + x;
- memcpy_pic(dst, image[0], w, h, xvimage[current_buf]->pitches[0], stride[0]);
-
- x/=2;y/=2;w/=2;h/=2;
-
- dst = xvimage[current_buf]->data + xvimage[current_buf]->offsets[1] +
- xvimage[current_buf]->pitches[1]*y + x;
- if(image_format!=IMGFMT_YV12)
- memcpy_pic(dst, image[1], w, h, xvimage[current_buf]->pitches[1], stride[1]);
- else
- memcpy_pic(dst, image[2], w, h, xvimage[current_buf]->pitches[1], stride[2]);
+#ifdef HAVE_SHM
+ if (Shmem_Flag)
+ {
+ XvShmPutImage(mDisplay, xv_port, vo_window, vo_gc,
+ xvimage[current_buf], 0, 0, image_width,
+ image_height, drwX - (vo_panscan_x >> 1),
+ drwY - (vo_panscan_y >> 1), vo_dwidth + vo_panscan_x,
+ (vo_fs ? vo_dheight - 1 : vo_dheight) + vo_panscan_y,
+ False);
+ } else
+#endif
+ {
+ XvPutImage(mDisplay, xv_port, vo_window, vo_gc,
+ xvimage[current_buf], 0, 0, image_width, image_height,
+ drwX - (vo_panscan_x >> 1), drwY - (vo_panscan_y >> 1),
+ vo_dwidth + vo_panscan_x,
+ (vo_fs ? vo_dheight - 1 : vo_dheight) + vo_panscan_y);
+ }
+ if (num_buffers > 1)
+ {
+ current_buf =
+ vo_directrendering ? 0 : ((current_buf + 1) % num_buffers);
+ XFlush(mDisplay);
+ } else
+ XSync(mDisplay, False);
+ return;
+}
+
+static uint32_t draw_slice(uint8_t * image[], int stride[], int w, int h,
+ int x, int y)
+{
+ uint8_t *dst;
+
+ dst = xvimage[current_buf]->data + xvimage[current_buf]->offsets[0] +
+ xvimage[current_buf]->pitches[0] * y + x;
+ memcpy_pic(dst, image[0], w, h, xvimage[current_buf]->pitches[0],
+ stride[0]);
+
+ x /= 2;
+ y /= 2;
+ w /= 2;
+ h /= 2;
+
+ dst = xvimage[current_buf]->data + xvimage[current_buf]->offsets[1] +
+ xvimage[current_buf]->pitches[1] * y + x;
+ if (image_format != IMGFMT_YV12)
+ memcpy_pic(dst, image[1], w, h, xvimage[current_buf]->pitches[1],
+ stride[1]);
+ else
+ memcpy_pic(dst, image[2], w, h, xvimage[current_buf]->pitches[1],
+ stride[2]);
- dst = xvimage[current_buf]->data + xvimage[current_buf]->offsets[2] +
- xvimage[current_buf]->pitches[2]*y + x;
- if(image_format==IMGFMT_YV12)
- memcpy_pic(dst, image[1], w, h, xvimage[current_buf]->pitches[1], stride[1]);
- else
- memcpy_pic(dst, image[2], w, h, xvimage[current_buf]->pitches[1], stride[2]);
+ dst = xvimage[current_buf]->data + xvimage[current_buf]->offsets[2] +
+ xvimage[current_buf]->pitches[2] * y + x;
+ if (image_format == IMGFMT_YV12)
+ memcpy_pic(dst, image[1], w, h, xvimage[current_buf]->pitches[1],
+ stride[1]);
+ else
+ memcpy_pic(dst, image[2], w, h, xvimage[current_buf]->pitches[1],
+ stride[2]);
- return 0;
+ return 0;
}
-static uint32_t draw_frame(uint8_t *src[]){
+static uint32_t draw_frame(uint8_t * src[])
+{
printf("draw_frame() called!!!!!!");
return -1;
}
-static uint32_t draw_image(mp_image_t *mpi){
- if(mpi->flags&MP_IMGFLAG_DIRECT){
- // direct rendering:
- current_buf=(int)(mpi->priv); // hack!
- return VO_TRUE;
- }
- if(mpi->flags&MP_IMGFLAG_DRAW_CALLBACK) return VO_TRUE; // done
- if(mpi->flags&MP_IMGFLAG_PLANAR){
- draw_slice(mpi->planes,mpi->stride,mpi->w,mpi->h,0,0);
- return VO_TRUE;
- }
- if(mpi->flags&MP_IMGFLAG_YUV){
- // packed YUV:
- memcpy_pic(xvimage[current_buf]->data+xvimage[current_buf]->offsets[0],
- mpi->planes[0],mpi->w*(mpi->bpp/8),mpi->h,
- xvimage[current_buf]->pitches[0], mpi->stride[0]);
- return VO_TRUE;
- }
- return VO_FALSE; // not (yet) supported
-}
-
-static uint32_t get_image(mp_image_t *mpi){
- int buf=current_buf; // we shouldn't change current_buf unless we do DR!
- if(mpi->type==MP_IMGTYPE_STATIC && num_buffers>1) return VO_FALSE; // it is not static
- if(mpi->imgfmt!=image_format) return VO_FALSE; // needs conversion :(
+static uint32_t draw_image(mp_image_t * mpi)
+{
+ if (mpi->flags & MP_IMGFLAG_DIRECT)
+ {
+ // direct rendering:
+ current_buf = (int) (mpi->priv); // hack!
+ return VO_TRUE;
+ }
+ if (mpi->flags & MP_IMGFLAG_DRAW_CALLBACK)
+ return VO_TRUE; // done
+ if (mpi->flags & MP_IMGFLAG_PLANAR)
+ {
+ draw_slice(mpi->planes, mpi->stride, mpi->w, mpi->h, 0, 0);
+ return VO_TRUE;
+ }
+ if (mpi->flags & MP_IMGFLAG_YUV)
+ {
+ // packed YUV:
+ memcpy_pic(xvimage[current_buf]->data +
+ xvimage[current_buf]->offsets[0], mpi->planes[0],
+ mpi->w * (mpi->bpp / 8), mpi->h,
+ xvimage[current_buf]->pitches[0], mpi->stride[0]);
+ return VO_TRUE;
+ }
+ return VO_FALSE; // not (yet) supported
+}
+
+static uint32_t get_image(mp_image_t * mpi)
+{
+ int buf = current_buf; // we shouldn't change current_buf unless we do DR!
+
+ if (mpi->type == MP_IMGTYPE_STATIC && num_buffers > 1)
+ return VO_FALSE; // it is not static
+ if (mpi->imgfmt != image_format)
+ return VO_FALSE; // needs conversion :(
// if(mpi->flags&MP_IMGFLAG_READABLE) return VO_FALSE; // slow video ram
- if(mpi->flags&MP_IMGFLAG_READABLE &&
- (mpi->type==MP_IMGTYPE_IPB || mpi->type==MP_IMGTYPE_IP)){
- // reference (I/P) frame of IP or IPB:
- if(num_buffers<2) return VO_FALSE; // not enough
- current_ip_buf^=1;
- // for IPB with 2 buffers we can DR only one of the 2 P frames:
- if(mpi->type==MP_IMGTYPE_IPB && num_buffers<3 && current_ip_buf) return VO_FALSE;
- buf=current_ip_buf;
- if(mpi->type==MP_IMGTYPE_IPB) ++buf; // preserve space for B
- }
- if(mpi->height > xvimage[buf]->height) return VO_FALSE; //buffer to small
- if(mpi->width*(mpi->bpp/8) > xvimage[buf]->pitches[0]) return VO_FALSE; //buffer to small
- if( (mpi->flags&(MP_IMGFLAG_ACCEPT_STRIDE|MP_IMGFLAG_ACCEPT_WIDTH)) ||
- (mpi->width*(mpi->bpp/8)==xvimage[buf]->pitches[0]) ){
- current_buf=buf;
- mpi->planes[0]=xvimage[current_buf]->data+xvimage[current_buf]->offsets[0];
- mpi->stride[0]=xvimage[current_buf]->pitches[0];
- mpi->width=mpi->stride[0]/(mpi->bpp/8);
- if(mpi->flags&MP_IMGFLAG_PLANAR){
- if(mpi->flags&MP_IMGFLAG_SWAPPED){
- // I420
- mpi->planes[1]=xvimage[current_buf]->data+xvimage[current_buf]->offsets[1];
- mpi->planes[2]=xvimage[current_buf]->data+xvimage[current_buf]->offsets[2];
- mpi->stride[1]=xvimage[current_buf]->pitches[1];
- mpi->stride[2]=xvimage[current_buf]->pitches[2];
- } else {
- // YV12
- mpi->planes[1]=xvimage[current_buf]->data+xvimage[current_buf]->offsets[2];
- mpi->planes[2]=xvimage[current_buf]->data+xvimage[current_buf]->offsets[1];
- mpi->stride[1]=xvimage[current_buf]->pitches[2];
- mpi->stride[2]=xvimage[current_buf]->pitches[1];
- }
- }
- mpi->flags|=MP_IMGFLAG_DIRECT;
- mpi->priv=(void*)current_buf;
-// printf("mga: get_image() SUCCESS -> Direct Rendering ENABLED\n");
- return VO_TRUE;
+ if (mpi->flags & MP_IMGFLAG_READABLE &&
+ (mpi->type == MP_IMGTYPE_IPB || mpi->type == MP_IMGTYPE_IP))
+ {
+ // reference (I/P) frame of IP or IPB:
+ if (num_buffers < 2)
+ return VO_FALSE; // not enough
+ current_ip_buf ^= 1;
+ // for IPB with 2 buffers we can DR only one of the 2 P frames:
+ if (mpi->type == MP_IMGTYPE_IPB && num_buffers < 3
+ && current_ip_buf)
+ return VO_FALSE;
+ buf = current_ip_buf;
+ if (mpi->type == MP_IMGTYPE_IPB)
+ ++buf; // preserve space for B
+ }
+ if (mpi->height > xvimage[buf]->height)
+ return VO_FALSE; //buffer to small
+ if (mpi->width * (mpi->bpp / 8) > xvimage[buf]->pitches[0])
+ return VO_FALSE; //buffer to small
+ if ((mpi->flags & (MP_IMGFLAG_ACCEPT_STRIDE | MP_IMGFLAG_ACCEPT_WIDTH))
+ || (mpi->width * (mpi->bpp / 8) == xvimage[buf]->pitches[0]))
+ {
+ current_buf = buf;
+ mpi->planes[0] =
+ xvimage[current_buf]->data + xvimage[current_buf]->offsets[0];
+ mpi->stride[0] = xvimage[current_buf]->pitches[0];
+ mpi->width = mpi->stride[0] / (mpi->bpp / 8);
+ if (mpi->flags & MP_IMGFLAG_PLANAR)
+ {
+ if (mpi->flags & MP_IMGFLAG_SWAPPED)
+ {
+ // I420
+ mpi->planes[1] =
+ xvimage[current_buf]->data +
+ xvimage[current_buf]->offsets[1];
+ mpi->planes[2] =
+ xvimage[current_buf]->data +
+ xvimage[current_buf]->offsets[2];
+ mpi->stride[1] = xvimage[current_buf]->pitches[1];
+ mpi->stride[2] = xvimage[current_buf]->pitches[2];
+ } else
+ {
+ // YV12
+ mpi->planes[1] =
+ xvimage[current_buf]->data +
+ xvimage[current_buf]->offsets[2];
+ mpi->planes[2] =
+ xvimage[current_buf]->data +
+ xvimage[current_buf]->offsets[1];
+ mpi->stride[1] = xvimage[current_buf]->pitches[2];
+ mpi->stride[2] = xvimage[current_buf]->pitches[1];
+ }
+ }
+ mpi->flags |= MP_IMGFLAG_DIRECT;
+ mpi->priv = (void *) current_buf;
+// printf("mga: get_image() SUCCESS -> Direct Rendering ENABLED\n");
+ return VO_TRUE;
}
return VO_FALSE;
}
@@ -575,186 +746,229 @@
static uint32_t query_format(uint32_t format)
{
uint32_t i;
- int flag=VFCAP_CSP_SUPPORTED|VFCAP_CSP_SUPPORTED_BY_HW|
- VFCAP_HWSCALE_UP|VFCAP_HWSCALE_DOWN|VFCAP_OSD|VFCAP_ACCEPT_STRIDE; // FIXME! check for DOWN
- /* check image formats */
- for(i = 0; i < formats; i++){
- if (fo[i].id == format) return flag; //xv_format = fo[i].id;
- }
- return 0;
-}
-
-static void uninit(void)
-{
- int i;
- if ( !vo_config_count ) return;
- XvFreeAdaptorInfo(ai);
- ai = NULL;
- saver_on(mDisplay); // screen saver back on
- for( i=0;i<num_buffers;i++ ) deallocate_xvimage( i );
+ int flag = VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_HWSCALE_UP | VFCAP_HWSCALE_DOWN | VFCAP_OSD | VFCAP_ACCEPT_STRIDE; // FIXME! check for DOWN
+
+ /* check image formats */
+ for (i = 0; i < formats; i++)
+ {
+ if (fo[i].id == format)
+ return flag; //xv_format = fo[i].id;
+ }
+ return 0;
+}
+
+static void uninit(void)
+{
+ int i;
+
+ if (!vo_config_count)
+ return;
+ XvFreeAdaptorInfo(ai);
+ ai = NULL;
+ saver_on(mDisplay); // screen saver back on
+ for (i = 0; i < num_buffers; i++)
+ deallocate_xvimage(i);
#ifdef HAVE_XF86VM
- vo_vm_close(mDisplay);
+ vo_vm_close(mDisplay);
#endif
- vo_x11_uninit();
+ vo_x11_uninit();
}
static uint32_t preinit(const char *arg)
{
XvPortID xv_p;
- int busy_ports=0;
+ int busy_ports = 0;
unsigned int i;
-
+
xv_port = 0;
- if(arg)
+ if (arg)
{
- if ((strlen(arg) >= 6) && !strncmp(arg, "port=", 5))
- {
- xv_port = atoi(arg+5);
- }
- else
- {
- mp_msg(MSGT_VO,MSGL_ERR,"vo_xv: Unknown subdevice: %s\n",arg);
- return ENOSYS;
- }
- }
- if (!vo_init()) return -1;
-
- /* check for Xvideo extension */
- if (Success != XvQueryExtension(mDisplay,&ver,&rel,&req,&ev,&err)){
- mp_msg(MSGT_VO,MSGL_ERR,"Sorry, Xv not supported by this X11 version/driver\n");
- mp_msg(MSGT_VO,MSGL_ERR,"******** Try with -vo x11 or -vo sdl *********\n");
- return -1;
- }
-
- /* check for Xvideo support */
- if (Success != XvQueryAdaptors(mDisplay,DefaultRootWindow(mDisplay), &adaptors,&ai)){
- mp_msg(MSGT_VO,MSGL_ERR,"Xv: XvQueryAdaptors failed\n");
- return -1;
+ if ((strlen(arg) >= 6) && !strncmp(arg, "port=", 5))
+ {
+ xv_port = atoi(arg + 5);
+ } else
+ {
+ mp_msg(MSGT_VO, MSGL_ERR, "vo_xv: Unknown subdevice: %s\n",
+ arg);
+ return ENOSYS;
+ }
}
+ if (!vo_init())
+ return -1;
- /* check adaptors */
- if (xv_port) {
+ /* check for Xvideo extension */
+ if (Success != XvQueryExtension(mDisplay, &ver, &rel, &req, &ev, &err))
+ {
+ mp_msg(MSGT_VO, MSGL_ERR,
+ "Sorry, Xv not supported by this X11 version/driver\n");
+ mp_msg(MSGT_VO, MSGL_ERR,
+ "******** Try with -vo x11 or -vo sdl *********\n");
+ return -1;
+ }
+
+ /* check for Xvideo support */
+ if (Success !=
+ XvQueryAdaptors(mDisplay, DefaultRootWindow(mDisplay), &adaptors,
+ &ai))
+ {
+ mp_msg(MSGT_VO, MSGL_ERR, "Xv: XvQueryAdaptors failed\n");
+ return -1;
+ }
+
+ /* check adaptors */
+ if (xv_port)
+ {
int port_found;
-
- for (port_found = 0, i = 0; !port_found && i < adaptors; i++) {
- if ((ai[i].type & XvInputMask) && (ai[i].type & XvImageMask)) {
- for (xv_p = ai[i].base_id; xv_p < ai[i].base_id+ai[i].num_ports; ++xv_p) {
- if (xv_p == xv_port) {
+
+ for (port_found = 0, i = 0; !port_found && i < adaptors; i++)
+ {
+ if ((ai[i].type & XvInputMask) && (ai[i].type & XvImageMask))
+ {
+ for (xv_p = ai[i].base_id;
+ xv_p < ai[i].base_id + ai[i].num_ports; ++xv_p)
+ {
+ if (xv_p == xv_port)
+ {
port_found = 1;
break;
}
}
}
}
- if (port_found) {
+ if (port_found)
+ {
if (XvGrabPort(mDisplay, xv_port, CurrentTime))
xv_port = 0;
- } else {
- mp_msg(MSGT_VO, MSGL_WARN,"Xv: Invalid port parameter, overriding with port 0\n");
+ } else
+ {
+ mp_msg(MSGT_VO, MSGL_WARN,
+ "Xv: Invalid port parameter, overriding with port 0\n");
xv_port = 0;
}
}
-
- for (i = 0; i < adaptors && xv_port == 0; i++){
- if ((ai[i].type & XvInputMask) && (ai[i].type & XvImageMask)) {
- for (xv_p = ai[i].base_id; xv_p < ai[i].base_id+ai[i].num_ports; ++xv_p)
- if (!XvGrabPort(mDisplay, xv_p, CurrentTime)) {
- xv_port = xv_p;
- break;
- } else {
- mp_msg(MSGT_VO,MSGL_WARN,"Xv: could not grab port %i\n", (int)xv_p);
- ++busy_ports;
- }
- }
- }
- if(!xv_port){
- if(busy_ports)
- mp_msg(MSGT_VO,MSGL_ERR,"Could not find free Xvideo port - maybe another process is already using it.\n"
- "Close all video applications, and try again. If that does not help,\n"
- "see 'mplayer -vo help' for other (non-xv) video out drivers.\n");
- else
- mp_msg(MSGT_VO,MSGL_ERR,"It seems there is no Xvideo support for your video card available.\n"
- "Run 'xvinfo' to verify its Xv support and read DOCS/HTML/en/devices.html#xv!\n"
- "See 'mplayer -vo help' for other (non-xv) video out drivers. Try -vo x11\n");
- return -1;
+
+ for (i = 0; i < adaptors && xv_port == 0; i++)
+ {
+ if ((ai[i].type & XvInputMask) && (ai[i].type & XvImageMask))
+ {
+ for (xv_p = ai[i].base_id;
+ xv_p < ai[i].base_id + ai[i].num_ports; ++xv_p)
+ if (!XvGrabPort(mDisplay, xv_p, CurrentTime))
+ {
+ xv_port = xv_p;
+ break;
+ } else
+ {
+ mp_msg(MSGT_VO, MSGL_WARN,
+ "Xv: could not grab port %i\n", (int) xv_p);
+ ++busy_ports;
+ }
+ }
+ }
+ if (!xv_port)
+ {
+ if (busy_ports)
+ mp_msg(MSGT_VO, MSGL_ERR,
+ "Could not find free Xvideo port - maybe another process is already using it.\n"
+ "Close all video applications, and try again. If that does not help,\n"
+ "see 'mplayer -vo help' for other (non-xv) video out drivers.\n");
+ else
+ mp_msg(MSGT_VO, MSGL_ERR,
+ "It seems there is no Xvideo support for your video card available.\n"
+ "Run 'xvinfo' to verify its Xv support and read DOCS/HTML/en/devices.html#xv!\n"
+ "See 'mplayer -vo help' for other (non-xv) video out drivers. Try -vo x11\n");
+ return -1;
}
{
- int howmany, i;
- const XvAttribute * const attributes = XvQueryPortAttributes(mDisplay, xv_port, &howmany);
-
- for (i = 0; i < howmany && attributes; i++)
- if (!strcmp(attributes[i].name, "XV_AUTOPAINT_COLORKEY"))
- {
- const Atom autopaint = XInternAtom(mDisplay, "XV_AUTOPAINT_COLORKEY", False);
- XvSetPortAttribute(mDisplay, xv_port, autopaint, 1);
- break;
- }
+ int howmany, i;
+ const XvAttribute *const attributes =
+ XvQueryPortAttributes(mDisplay, xv_port, &howmany);
+
+ for (i = 0; i < howmany && attributes; i++)
+ if (!strcmp(attributes[i].name, "XV_AUTOPAINT_COLORKEY"))
+ {
+ const Atom autopaint =
+ XInternAtom(mDisplay, "XV_AUTOPAINT_COLORKEY", False);
+ XvSetPortAttribute(mDisplay, xv_port, autopaint, 1);
+ break;
+ }
}
- fo = XvListImageFormats(mDisplay, xv_port, (int*)&formats);
+ fo = XvListImageFormats(mDisplay, xv_port, (int *) &formats);
return 0;
}
static uint32_t control(uint32_t request, void *data, ...)
{
- switch (request) {
- case VOCTRL_PAUSE: return (int_pause=1);
- case VOCTRL_RESUME: return (int_pause=0);
- case VOCTRL_QUERY_FORMAT:
- return query_format(*((uint32_t*)data));
- case VOCTRL_GET_IMAGE:
- return get_image(data);
- case VOCTRL_DRAW_IMAGE:
- return draw_image(data);
- case VOCTRL_GUISUPPORT:
- return VO_TRUE;
- case VOCTRL_GET_PANSCAN:
- if ( !vo_config_count || !vo_fs ) return VO_FALSE;
- return VO_TRUE;
- case VOCTRL_FULLSCREEN:
- vo_x11_fullscreen();
- /* indended, fallthrough to update panscan on fullscreen/windowed switch */
- case VOCTRL_SET_PANSCAN:
- if ( ( vo_fs && ( vo_panscan != vo_panscan_amount ) ) || ( !vo_fs && vo_panscan_amount ) )
- {
- int old_y = vo_panscan_y;
- panscan_calc();
-
- if(old_y != vo_panscan_y)
- {
- vo_x11_clearwindow_part(mDisplay, vo_window, vo_dwidth+vo_panscan_x-1, vo_dheight+vo_panscan_y-1, 1);
- flip_page();
- }
- }
- return VO_TRUE;
- case VOCTRL_SET_EQUALIZER:
- {
- va_list ap;
- int value;
-
- va_start(ap, data);
- value = va_arg(ap, int);
- va_end(ap);
-
- return(vo_xv_set_eq(xv_port, data, value));
- }
- case VOCTRL_GET_EQUALIZER:
- {
- va_list ap;
- int *value;
-
- va_start(ap, data);
- value = va_arg(ap, int*);
- va_end(ap);
-
- return(vo_xv_get_eq(xv_port, data, value));
- }
- case VOCTRL_ONTOP:
- vo_x11_ontop();
- return VO_TRUE;
- }
- return VO_NOTIMPL;
+ switch (request)
+ {
+ case VOCTRL_PAUSE:
+ return (int_pause = 1);
+ case VOCTRL_RESUME:
+ return (int_pause = 0);
+ case VOCTRL_QUERY_FORMAT:
+ return query_format(*((uint32_t *) data));
+ case VOCTRL_GET_IMAGE:
+ return get_image(data);
+ case VOCTRL_DRAW_IMAGE:
+ return draw_image(data);
+ case VOCTRL_GUISUPPORT:
+ return VO_TRUE;
+ case VOCTRL_GET_PANSCAN:
+ if (!vo_config_count || !vo_fs)
+ return VO_FALSE;
+ return VO_TRUE;
+ case VOCTRL_FULLSCREEN:
+ vo_x11_fullscreen();
+ /* indended, fallthrough to update panscan on fullscreen/windowed switch */
+ case VOCTRL_SET_PANSCAN:
+ if ((vo_fs && (vo_panscan != vo_panscan_amount))
+ || (!vo_fs && vo_panscan_amount))
+ {
+ int old_y = vo_panscan_y;
+
+ panscan_calc();
+
+ if (old_y != vo_panscan_y)
+ {
+ vo_x11_clearwindow_part(mDisplay, vo_window,
+ vo_dwidth + vo_panscan_x - 1,
+ vo_dheight + vo_panscan_y - 1,
+ 1);
+ flip_page();
+ }
+ }
+ return VO_TRUE;
+ case VOCTRL_SET_EQUALIZER:
+ {
+ va_list ap;
+ int value;
+
+ va_start(ap, data);
+ value = va_arg(ap, int);
+
+ va_end(ap);
+
+ return (vo_xv_set_eq(xv_port, data, value));
+ }
+ case VOCTRL_GET_EQUALIZER:
+ {
+ va_list ap;
+ int *value;
+
+ va_start(ap, data);
+ value = va_arg(ap, int *);
+
+ va_end(ap);
+
+ return (vo_xv_get_eq(xv_port, data, value));
+ }
+ case VOCTRL_ONTOP:
+ vo_x11_ontop();
+ return VO_TRUE;
+ }
+ return VO_NOTIMPL;
}
Index: vo_xvidix.c
===================================================================
RCS file: /cvsroot/mplayer/main/libvo/vo_xvidix.c,v
retrieving revision 1.66
retrieving revision 1.67
diff -u -r1.66 -r1.67
--- vo_xvidix.c 30 Nov 2003 16:36:10 -0000 1.66
+++ vo_xvidix.c 14 Jun 2004 04:53:03 -0000 1.67
@@ -38,8 +38,7 @@
#endif
-static vo_info_t info =
-{
+static vo_info_t info = {
"X11 (VIDIX)",
"xvidix",
"Alex Beregszaszi",
@@ -47,9 +46,7 @@
};
LIBVO_EXTERN(xvidix)
-
-#define UNUSED(x) ((void)(x)) /* Removes warning about unused arguments */
-
+#define UNUSED(x) ((void)(x)) /* Removes warning about unused arguments */
/* X11 related variables */
/* Colorkey handling */
static XGCValues mGCV;
@@ -72,7 +69,7 @@
static uint32_t drwX, drwY, drwWidth, drwHeight, drwBorderWidth,
drwDepth, drwcX, drwcY, dwidth, dheight;
-extern void set_video_eq( int cap );
+extern void set_video_eq(int cap);
#ifdef HAVE_XINERAMA
extern int xinerama_screen;
@@ -81,129 +78,144 @@
static void set_window(int force_update)
{
Window mRoot;
- if ( WinID )
- {
- XGetGeometry(mDisplay, vo_window, &mRoot, &drwX, &drwY, &drwWidth,
- &drwHeight, &drwBorderWidth, &drwDepth);
- drwX = drwY = 0;
-
- XTranslateCoordinates(mDisplay, vo_window, mRoot, 0, 0,
- &drwcX, &drwcY, &mRoot);
- aspect(&dwidth,&dheight,A_NOZOOM);
- if (!vo_fs)
- mp_msg(MSGT_VO, MSGL_V, "[xvidix] dcx: %d dcy: %d dx: %d dy: %d dw: %d dh: %d\n",
- drwcX, drwcY, drwX, drwY, drwWidth, drwHeight);
-
- /* following stuff copied from vo_xmga.c */
- }
- else
- {
- aspect(&dwidth,&dheight,A_NOZOOM);
- drwcX=drwX=vo_dx; drwcY=drwY=vo_dy; drwWidth=vo_dwidth; drwHeight=vo_dheight;
- }
+
+ if (WinID)
+ {
+ XGetGeometry(mDisplay, vo_window, &mRoot, &drwX, &drwY, &drwWidth,
+ &drwHeight, &drwBorderWidth, &drwDepth);
+ drwX = drwY = 0;
+
+ XTranslateCoordinates(mDisplay, vo_window, mRoot, 0, 0,
+ &drwcX, &drwcY, &mRoot);
+ aspect(&dwidth, &dheight, A_NOZOOM);
+ if (!vo_fs)
+ mp_msg(MSGT_VO, MSGL_V,
+ "[xvidix] dcx: %d dcy: %d dx: %d dy: %d dw: %d dh: %d\n",
+ drwcX, drwcY, drwX, drwY, drwWidth, drwHeight);
+
+ /* following stuff copied from vo_xmga.c */
+ } else
+ {
+ aspect(&dwidth, &dheight, A_NOZOOM);
+ drwcX = drwX = vo_dx;
+ drwcY = drwY = vo_dy;
+ drwWidth = vo_dwidth;
+ drwHeight = vo_dheight;
+ }
#if X11_FULLSCREEN
if (vo_fs)
{
- aspect(&dwidth,&dheight,A_ZOOM);
- drwX = (vo_screenwidth - (dwidth > vo_screenwidth ? vo_screenwidth : dwidth)) / 2;
- drwcX = drwX;
- drwY = (vo_screenheight - (dheight > vo_screenheight ? vo_screenheight : dheight)) / 2;
- drwcY = drwY;
- drwWidth = (dwidth > vo_screenwidth ? vo_screenwidth : dwidth);
- drwHeight = (dheight > vo_screenheight ? vo_screenheight : dheight);
- mp_msg(MSGT_VO, MSGL_V, "[xvidix-fs] dcx: %d dcy: %d dx: %d dy: %d dw: %d dh: %d\n",
- drwcX, drwcY, drwX, drwY, drwWidth, drwHeight);
+ aspect(&dwidth, &dheight, A_ZOOM);
+ drwX =
+ (vo_screenwidth -
+ (dwidth > vo_screenwidth ? vo_screenwidth : dwidth)) / 2;
+ drwcX = drwX;
+ drwY =
+ (vo_screenheight -
+ (dheight > vo_screenheight ? vo_screenheight : dheight)) / 2;
+ drwcY = drwY;
+ drwWidth = (dwidth > vo_screenwidth ? vo_screenwidth : dwidth);
+ drwHeight =
+ (dheight > vo_screenheight ? vo_screenheight : dheight);
+ mp_msg(MSGT_VO, MSGL_V,
+ "[xvidix-fs] dcx: %d dcy: %d dx: %d dy: %d dw: %d dh: %d\n",
+ drwcX, drwcY, drwX, drwY, drwWidth, drwHeight);
}
#endif
- vo_dwidth=drwWidth; vo_dheight=drwHeight;
+ vo_dwidth = drwWidth;
+ vo_dheight = drwHeight;
#ifdef HAVE_XINERAMA
if (XineramaIsActive(mDisplay))
{
- XineramaScreenInfo *screens;
- int num_screens;
- int i = 0;
-
- screens = XineramaQueryScreens(mDisplay, &num_screens);
-
- /* find the screen we are on */
- while (i<num_screens &&
- ((screens[i].x_org < drwcX) || (screens[i].y_org < drwcY) ||
- (screens[i].x_org + screens[i].width >= drwcX) ||
- (screens[i].y_org + screens[i].height >= drwcY)))
- {
- i++;
- }
-
- if(i<num_screens)
- {
- /* save the screen we are on */
- xinerama_screen = i;
- } else {
- /* oops.. couldnt find the screen we are on
- * because the upper left corner left the
- * visual range. assume we are still on the
- * same screen
- */
- i = xinerama_screen;
- }
-
- /* set drwcX and drwcY to the right values */
- drwcX = drwcX - screens[i].x_org;
- drwcY = drwcY - screens[i].y_org;
- XFree(screens);
+ XineramaScreenInfo *screens;
+ int num_screens;
+ int i = 0;
+
+ screens = XineramaQueryScreens(mDisplay, &num_screens);
+
+ /* find the screen we are on */
+ while (i < num_screens &&
+ ((screens[i].x_org < drwcX) || (screens[i].y_org < drwcY) ||
+ (screens[i].x_org + screens[i].width >= drwcX) ||
+ (screens[i].y_org + screens[i].height >= drwcY)))
+ {
+ i++;
+ }
+
+ if (i < num_screens)
+ {
+ /* save the screen we are on */
+ xinerama_screen = i;
+ } else
+ {
+ /* oops.. couldnt find the screen we are on
+ * because the upper left corner left the
+ * visual range. assume we are still on the
+ * same screen
+ */
+ i = xinerama_screen;
+ }
+
+ /* set drwcX and drwcY to the right values */
+ drwcX = drwcX - screens[i].x_org;
+ drwcY = drwcY - screens[i].y_org;
+ XFree(screens);
}
#endif
- if ( vo_panscan > 0.0f && vo_fs )
- {
- drwcX-=vo_panscan_x >> 1;
- drwcY-=vo_panscan_y >> 1;
- drwX-=vo_panscan_x >> 1;
- drwY-=vo_panscan_y >> 1;
- drwWidth+=vo_panscan_x;
- drwHeight+=vo_panscan_y;
- }
+ if (vo_panscan > 0.0f && vo_fs)
+ {
+ drwcX -= vo_panscan_x >> 1;
+ drwcY -= vo_panscan_y >> 1;
+ drwX -= vo_panscan_x >> 1;
+ drwY -= vo_panscan_y >> 1;
+ drwWidth += vo_panscan_x;
+ drwHeight += vo_panscan_y;
+ }
/* set new values in VIDIX */
if (force_update || (window_x != drwcX) || (window_y != drwcY) ||
- (window_width != drwWidth) || (window_height != drwHeight))
+ (window_width != drwWidth) || (window_height != drwHeight))
{
- // do a backup of window coordinates
- window_x = drwcX;
- window_y = drwcY;
- vo_dx = drwcX;
- vo_dy = drwcY;
- window_width = drwWidth;
- window_height = drwHeight;
-
- /* FIXME: implement runtime resize/move if possible, this way is very ugly! */
- vidix_stop();
- if (vidix_init(image_width, image_height, vo_dx, vo_dy,
- window_width, window_height, image_format, vo_depthonscreen,
- vo_screenwidth, vo_screenheight) != 0)
+ // do a backup of window coordinates
+ window_x = drwcX;
+ window_y = drwcY;
+ vo_dx = drwcX;
+ vo_dy = drwcY;
+ window_width = drwWidth;
+ window_height = drwHeight;
+
+ /* FIXME: implement runtime resize/move if possible, this way is very ugly! */
+ vidix_stop();
+ if (vidix_init(image_width, image_height, vo_dx, vo_dy,
+ window_width, window_height, image_format,
+ vo_depthonscreen, vo_screenwidth,
+ vo_screenheight) != 0)
{
- mp_msg(MSGT_VO, MSGL_FATAL, "Can't initialize VIDIX driver: %s\n", strerror(errno));
- abort();
- }
- vidix_start();
- }
-
- mp_msg(MSGT_VO, MSGL_V, "[xvidix] window properties: pos: %dx%d, size: %dx%d\n",
- vo_dx, vo_dy, window_width, window_height);
+ mp_msg(MSGT_VO, MSGL_FATAL,
+ "Can't initialize VIDIX driver: %s\n", strerror(errno));
+ abort();
+ }
+ vidix_start();
+ }
+
+ mp_msg(MSGT_VO, MSGL_V,
+ "[xvidix] window properties: pos: %dx%d, size: %dx%d\n", vo_dx,
+ vo_dy, window_width, window_height);
/* mDrawColorKey: */
/* fill drawable with specified color */
if (!(vo_colorkey & 0xff000000))
{
- XSetBackground(mDisplay, vo_gc, 0L);
- XClearWindow( mDisplay,vo_window );
- XSetForeground(mDisplay, vo_gc, colorkey);
- XFillRectangle(mDisplay, vo_window, vo_gc, drwX, drwY, drwWidth,
- (vo_fs ? drwHeight - 1 : drwHeight));
+ XSetBackground(mDisplay, vo_gc, 0L);
+ XClearWindow(mDisplay, vo_window);
+ XSetForeground(mDisplay, vo_gc, colorkey);
+ XFillRectangle(mDisplay, vo_window, vo_gc, drwX, drwY, drwWidth,
+ (vo_fs ? drwHeight - 1 : drwHeight));
}
/* flush, update drawable */
XFlush(mDisplay);
@@ -215,9 +227,11 @@
* allocate colors and (shared) memory
*/
static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width,
- uint32_t d_height, uint32_t flags, char *title, uint32_t format)
+ uint32_t d_height, uint32_t flags, char *title,
+ uint32_t format)
{
XVisualInfo vinfo;
+
// XSizeHints hint;
XSetWindowAttributes xswa;
unsigned long xswamask;
@@ -231,7 +245,7 @@
image_height = height;
image_width = width;
image_format = format;
- vo_mouse_autohide=1;
+ vo_mouse_autohide = 1;
aspect_save_orig(width, height);
aspect_save_prescale(d_width, d_height);
@@ -239,8 +253,10 @@
vo_dx = 0;
vo_dy = 0;
- vo_dx=( vo_screenwidth - d_width ) / 2; vo_dy=( vo_screenheight - d_height ) / 2;
- geometry(&vo_dx, &vo_dy, &d_width, &d_height, vo_screenwidth, vo_screenheight);
+ vo_dx = (vo_screenwidth - d_width) / 2;
+ vo_dy = (vo_screenheight - d_height) / 2;
+ geometry(&vo_dx, &vo_dy, &d_width, &d_height, vo_screenwidth,
+ vo_screenheight);
window_width = d_width;
window_height = d_height;
@@ -251,114 +267,146 @@
r = (vo_colorkey & 0x00ff0000) >> 16;
g = (vo_colorkey & 0x0000ff00) >> 8;
b = vo_colorkey & 0x000000ff;
- switch(vo_depthonscreen)
+ switch (vo_depthonscreen)
{
- case 32:
- colorkey = vo_colorkey;
- break;
- case 24:
- colorkey = vo_colorkey & 0x00ffffff;
- break;
- case 16:
- colorkey = ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3);
- break;
- case 15:
- colorkey = ((r >> 3) << 10) | ((g >> 3) << 5) | (b >> 3);
- break;
- default:
- mp_msg(MSGT_VO, MSGL_ERR, "Sorry, this (%d) color depth is not supported\n",
- vo_depthonscreen);
+ case 32:
+ colorkey = vo_colorkey;
+ break;
+ case 24:
+ colorkey = vo_colorkey & 0x00ffffff;
+ break;
+ case 16:
+ colorkey = ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3);
+ break;
+ case 15:
+ colorkey = ((r >> 3) << 10) | ((g >> 3) << 5) | (b >> 3);
+ break;
+ default:
+ mp_msg(MSGT_VO, MSGL_ERR,
+ "Sorry, this (%d) color depth is not supported\n",
+ vo_depthonscreen);
}
mp_msg(MSGT_VO, MSGL_INFO, "Using colorkey: %x\n", colorkey);
aspect(&d_width, &d_height, A_NOZOOM);
- vo_dwidth=d_width; vo_dheight=d_height;
+ vo_dwidth = d_width;
+ vo_dheight = d_height;
#ifdef HAVE_NEW_GUI
-if(use_gui) guiGetEvent( guiSetShVideo,0 ); // the GUI will set up / resize the window
-else
-{
+ if (use_gui)
+ guiGetEvent(guiSetShVideo, 0); // the GUI will set up / resize the window
+ else
+ {
#endif
#ifdef X11_FULLSCREEN
- if ( ( flags&1 )||(flags & 0x04) ) aspect(&d_width, &d_height, A_ZOOM);
+ if ((flags & 1) || (flags & 0x04))
+ aspect(&d_width, &d_height, A_ZOOM);
#endif
- dwidth = d_width;
- dheight = d_height;
- /* Make the window */
- XGetWindowAttributes(mDisplay, DefaultRootWindow(mDisplay), &attribs);
-
- /* from vo_x11 */
- window_depth = attribs.depth;
- if ((window_depth != 15) && (window_depth != 16) && (window_depth != 24)
- && (window_depth != 32))
- window_depth = 24;
- XMatchVisualInfo(mDisplay, mScreen, window_depth, TrueColor, &vinfo);
-
- xswa.background_pixel = BlackPixel(mDisplay, mScreen);
- xswa.border_pixel = 0;
- xswa.colormap = XCreateColormap(mDisplay, RootWindow(mDisplay, mScreen),
- vinfo.visual, AllocNone);
- xswa.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask | PropertyChangeMask |
- ((WinID==0)?0:(ButtonPressMask | ButtonReleaseMask | PointerMotionMask));
- xswamask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask;
-
- if (WinID >= 0)
- {
- vo_window = WinID ? ((Window)WinID) : RootWindow(mDisplay, mScreen);
- if ( WinID )
- {
- XUnmapWindow(mDisplay, vo_window);
- XChangeWindowAttributes(mDisplay, vo_window, xswamask, &xswa);
- vo_x11_selectinput_witherr( mDisplay,vo_window,StructureNotifyMask | KeyPressMask | PropertyChangeMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask | ExposureMask );
- } else 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);
-
- if ( flags&1 ) vo_x11_fullscreen();
-
+ dwidth = d_width;
+ dheight = d_height;
+ /* Make the window */
+ XGetWindowAttributes(mDisplay, DefaultRootWindow(mDisplay),
+ &attribs);
+
+ /* from vo_x11 */
+ window_depth = attribs.depth;
+ if ((window_depth != 15) && (window_depth != 16)
+ && (window_depth != 24) && (window_depth != 32))
+ window_depth = 24;
+ XMatchVisualInfo(mDisplay, mScreen, window_depth, TrueColor,
+ &vinfo);
+
+ xswa.background_pixel = BlackPixel(mDisplay, mScreen);
+ xswa.border_pixel = 0;
+ xswa.colormap =
+ XCreateColormap(mDisplay, RootWindow(mDisplay, mScreen),
+ vinfo.visual, AllocNone);
+ xswa.event_mask =
+ StructureNotifyMask | ExposureMask | KeyPressMask |
+ PropertyChangeMask | ((WinID == 0) ? 0
+ : (ButtonPressMask | ButtonReleaseMask |
+ PointerMotionMask));
+ xswamask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask;
+
+ if (WinID >= 0)
+ {
+ vo_window =
+ WinID ? ((Window) WinID) : RootWindow(mDisplay, mScreen);
+ if (WinID)
+ {
+ XUnmapWindow(mDisplay, vo_window);
+ XChangeWindowAttributes(mDisplay, vo_window, xswamask,
+ &xswa);
+ vo_x11_selectinput_witherr(mDisplay, vo_window,
+ StructureNotifyMask |
+ KeyPressMask |
+ PropertyChangeMask |
+ PointerMotionMask |
+ ButtonPressMask |
+ ButtonReleaseMask |
+ ExposureMask);
+ } else
+ 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);
+
+ if (flags & 1)
+ vo_x11_fullscreen();
+
#ifdef HAVE_XINERAMA
- vo_x11_xinerama_move(mDisplay, vo_window);
+ vo_x11_xinerama_move(mDisplay, vo_window);
#endif
- } else if ( !(flags&1) ) XMoveResizeWindow( mDisplay,vo_window,vo_dx,vo_dy,vo_dwidth,vo_dheight );
- }
-
- if ( vo_gc != None ) XFreeGC( mDisplay,vo_gc );
- vo_gc = XCreateGC(mDisplay, vo_window, GCForeground, &mGCV);
+ } else if (!(flags & 1))
+ XMoveResizeWindow(mDisplay, vo_window, vo_dx, vo_dy,
+ vo_dwidth, vo_dheight);
+ }
+
+ if (vo_gc != None)
+ XFreeGC(mDisplay, vo_gc);
+ vo_gc = XCreateGC(mDisplay, vo_window, GCForeground, &mGCV);
#ifdef HAVE_NEW_GUI
-}
+ }
#endif
- if ( ( !WinID )&&( flags&1 ) ) { vo_dx=0; vo_dy=0; vo_dwidth=vo_screenwidth; vo_dheight=vo_screenheight; vo_fs=1; }
+ if ((!WinID) && (flags & 1))
+ {
+ vo_dx = 0;
+ vo_dy = 0;
+ vo_dwidth = vo_screenwidth;
+ vo_dheight = vo_screenheight;
+ vo_fs = 1;
+ }
if (vidix_grkey_support())
{
- vidix_grkey_get(&gr_key);
- gr_key.key_op = KEYS_PUT;
- if (!(vo_colorkey & 0xff000000))
- {
- gr_key.ckey.op = CKEY_TRUE;
- gr_key.ckey.red = r;
- gr_key.ckey.green = g;
- gr_key.ckey.blue = b;
- }
- else
- gr_key.ckey.op = CKEY_FALSE;
- vidix_grkey_set(&gr_key);
+ vidix_grkey_get(&gr_key);
+ gr_key.key_op = KEYS_PUT;
+ if (!(vo_colorkey & 0xff000000))
+ {
+ gr_key.ckey.op = CKEY_TRUE;
+ gr_key.ckey.red = r;
+ gr_key.ckey.green = g;
+ gr_key.ckey.blue = b;
+ } else
+ gr_key.ckey.op = CKEY_FALSE;
+ vidix_grkey_set(&gr_key);
}
set_window(1);
@@ -368,11 +416,12 @@
panscan_calc();
- if (vo_ontop) vo_x11_setlayer(mDisplay, vo_window, vo_ontop);
+ if (vo_ontop)
+ vo_x11_setlayer(mDisplay, vo_window, vo_ontop);
- saver_off(mDisplay); /* turning off screen saver */
+ saver_off(mDisplay); /* turning off screen saver */
- return(0);
+ return (0);
}
static void check_events(void)
@@ -380,7 +429,7 @@
const int event = vo_x11_check_events(mDisplay);
if ((event & VO_EVENT_RESIZE) || (event & VO_EVENT_EXPOSE))
- set_window(0);
+ set_window(0);
return;
}
@@ -389,18 +438,20 @@
overwritten with vidix functions (vosub_vidix.c) */
static void draw_osd(void)
{
- mp_msg(MSGT_VO, MSGL_FATAL, "[xvidix] error: didn't used vidix draw_osd!\n");
+ mp_msg(MSGT_VO, MSGL_FATAL,
+ "[xvidix] error: didn't used vidix draw_osd!\n");
return;
}
static void flip_page(void)
{
- mp_msg(MSGT_VO, MSGL_FATAL, "[xvidix] error: didn't used vidix flip_page!\n");
+ mp_msg(MSGT_VO, MSGL_FATAL,
+ "[xvidix] error: didn't used vidix flip_page!\n");
return;
}
-static uint32_t draw_slice(uint8_t *src[], int stride[],
- int w, int h, int x, int y)
+static uint32_t draw_slice(uint8_t * src[], int stride[],
+ int w, int h, int x, int y)
{
UNUSED(src);
UNUSED(stride);
@@ -408,34 +459,37 @@
UNUSED(h);
UNUSED(x);
UNUSED(y);
- mp_msg(MSGT_VO, MSGL_FATAL, "[xvidix] error: didn't used vidix draw_slice!\n");
- return(-1);
+ mp_msg(MSGT_VO, MSGL_FATAL,
+ "[xvidix] error: didn't used vidix draw_slice!\n");
+ return (-1);
}
-static uint32_t draw_frame(uint8_t *src[])
+static uint32_t draw_frame(uint8_t * src[])
{
UNUSED(src);
- mp_msg(MSGT_VO, MSGL_FATAL, "[xvidix] error: didn't used vidix draw_frame!\n");
- return(-1);
+ mp_msg(MSGT_VO, MSGL_FATAL,
+ "[xvidix] error: didn't used vidix draw_frame!\n");
+ return (-1);
}
static uint32_t query_format(uint32_t format)
{
- return(vidix_query_fourcc(format));
+ return (vidix_query_fourcc(format));
}
static void uninit(void)
{
- if ( !vo_config_count ) return;
+ if (!vo_config_count)
+ return;
vidix_term();
-
+
if (vidix_name)
{
- free(vidix_name);
- vidix_name = NULL;
+ free(vidix_name);
+ vidix_name = NULL;
}
- saver_on(mDisplay); /* screen saver back on */
+ saver_on(mDisplay); /* screen saver back on */
vo_x11_uninit();
}
@@ -446,63 +500,69 @@
vidix_name = strdup(arg);
else
{
- mp_msg(MSGT_VO, MSGL_INFO, "No vidix driver name provided, probing available ones (-v option for details)!\n");
- vidix_name = NULL;
+ mp_msg(MSGT_VO, MSGL_INFO,
+ "No vidix driver name provided, probing available ones (-v option for details)!\n");
+ vidix_name = NULL;
}
- if (!vo_init()) return(-1);
+ if (!vo_init())
+ return (-1);
if (vidix_preinit(vidix_name, &video_out_xvidix) != 0)
- return(1);
+ return (1);
- return(0);
+ return (0);
}
static uint32_t control(uint32_t request, void *data, ...)
{
- switch (request) {
- case VOCTRL_QUERY_FORMAT:
- return query_format(*((uint32_t*)data));
- case VOCTRL_GUISUPPORT:
- return VO_TRUE;
- case VOCTRL_GET_PANSCAN:
- if ( !vo_config_count || !vo_fs ) return VO_FALSE;
- return VO_TRUE;
- case VOCTRL_ONTOP:
- vo_x11_ontop();
- return VO_TRUE;
- case VOCTRL_FULLSCREEN:
- vo_x11_fullscreen();
- case VOCTRL_SET_PANSCAN:
- if ( vo_fs && ( vo_panscan != vo_panscan_amount ) )
- {
- panscan_calc();
- set_window(0);
- }
- return VO_TRUE;
- case VOCTRL_SET_EQUALIZER:
- {
- va_list ap;
- int value;
-
- va_start(ap, data);
- value = va_arg(ap, int);
- va_end(ap);
-
- return vidix_control(request, data, (int *)value);
- }
- case VOCTRL_GET_EQUALIZER:
- {
- va_list ap;
- int *value;
-
- va_start(ap, data);
- value = va_arg(ap, int*);
- va_end(ap);
-
- return vidix_control(request, data, value);
- }
- }
- return vidix_control(request, data);
+ switch (request)
+ {
+ case VOCTRL_QUERY_FORMAT:
+ return query_format(*((uint32_t *) data));
+ case VOCTRL_GUISUPPORT:
+ return VO_TRUE;
+ case VOCTRL_GET_PANSCAN:
+ if (!vo_config_count || !vo_fs)
+ return VO_FALSE;
+ return VO_TRUE;
+ case VOCTRL_ONTOP:
+ vo_x11_ontop();
+ return VO_TRUE;
+ case VOCTRL_FULLSCREEN:
+ vo_x11_fullscreen();
+ case VOCTRL_SET_PANSCAN:
+ if (vo_fs && (vo_panscan != vo_panscan_amount))
+ {
+ panscan_calc();
+ set_window(0);
+ }
+ return VO_TRUE;
+ case VOCTRL_SET_EQUALIZER:
+ {
+ va_list ap;
+ int value;
+
+ va_start(ap, data);
+ value = va_arg(ap, int);
+
+ va_end(ap);
+
+ return vidix_control(request, data, (int *) value);
+ }
+ case VOCTRL_GET_EQUALIZER:
+ {
+ va_list ap;
+ int *value;
+
+ va_start(ap, data);
+ value = va_arg(ap, int *);
+
+ va_end(ap);
+
+ return vidix_control(request, data, value);
+ }
+ }
+ return vidix_control(request, data);
// return VO_NOTIMPL;
}
Index: x11_common.c
===================================================================
RCS file: /cvsroot/mplayer/main/libvo/x11_common.c,v
retrieving revision 1.172
retrieving revision 1.173
diff -u -r1.172 -r1.173
--- x11_common.c 2 Jun 2004 02:34:39 -0000 1.172
+++ x11_common.c 14 Jun 2004 04:53:03 -0000 1.173
@@ -57,30 +57,30 @@
#define WIN_LAYER_NORMAL 4
#define WIN_LAYER_ONTOP 6
#define WIN_LAYER_ABOVE_DOCK 10
-
-int fs_layer=WIN_LAYER_ABOVE_DOCK;
-static int orig_layer=0;
+
+int fs_layer = WIN_LAYER_ABOVE_DOCK;
+static int orig_layer = 0;
static int old_gravity = NorthWestGravity;
-int stop_xscreensaver=0;
+int stop_xscreensaver = 0;
-static int dpms_disabled=0;
-static int timeout_save=0;
-static int kdescreensaver_was_running=0;
-
-char* mDisplayName=NULL;
-Display* mDisplay=NULL;
-Window mRootWin;
+static int dpms_disabled = 0;
+static int timeout_save = 0;
+static int kdescreensaver_was_running = 0;
+
+char *mDisplayName = NULL;
+Display *mDisplay = NULL;
+Window mRootWin;
int mScreen;
int mLocalDisplay;
/* output window id */
-int WinID=-1;
+int WinID = -1;
int vo_mouse_autohide = 0;
int vo_wm_type = 0;
static int vo_fs_type = 0;
static int vo_fs_flip = 0;
-char** vo_fstype_list;
+char **vo_fstype_list;
/* if equal to 1 means that WM is a metacity (broken as hell) */
int metacity_hack = 0;
@@ -110,7 +110,7 @@
int xinerama_y = 0;
#endif
#ifdef HAVE_XF86VM
-XF86VidModeModeInfo **vidmodes=NULL;
+XF86VidModeModeInfo **vidmodes = NULL;
XF86VidModeModeLine modeline;
#endif
@@ -124,80 +124,85 @@
* _NET_WM_STATE_ADD -- add state
* _NET_WM_STATE_TOGGLE -- toggle
*/
-void vo_x11_ewmh_fullscreen( int action )
+void vo_x11_ewmh_fullscreen(int action)
+{
+ assert(action == _NET_WM_STATE_REMOVE ||
+ action == _NET_WM_STATE_ADD || action == _NET_WM_STATE_TOGGLE);
+
+ if (vo_fs_type & vo_wm_FULLSCREEN)
+ {
+ XEvent xev;
+
+ /* init X event structure for _NET_WM_FULLSCREEN client msg */
+ xev.xclient.type = ClientMessage;
+ xev.xclient.serial = 0;
+ xev.xclient.send_event = True;
+ xev.xclient.message_type = XInternAtom(mDisplay,
+ "_NET_WM_STATE", False);
+ xev.xclient.window = vo_window;
+ xev.xclient.format = 32;
+ xev.xclient.data.l[0] = action;
+ xev.xclient.data.l[1] = XInternAtom(mDisplay,
+ "_NET_WM_STATE_FULLSCREEN",
+ False);
+ xev.xclient.data.l[2] = 0;
+ xev.xclient.data.l[3] = 0;
+ xev.xclient.data.l[4] = 0;
+
+ /* finally send that damn thing */
+ if (!XSendEvent(mDisplay, DefaultRootWindow(mDisplay), False,
+ SubstructureRedirectMask | SubstructureNotifyMask,
+ &xev))
+ {
+ mp_msg(MSGT_VO, MSGL_ERR, MSGTR_EwmhFullscreenStateFailed);
+ }
+ }
+}
+
+void vo_hidecursor(Display * disp, Window win)
+{
+ Cursor no_ptr;
+ Pixmap bm_no;
+ XColor black, dummy;
+ Colormap colormap;
+ static unsigned char bm_no_data[] = { 0, 0, 0, 0, 0, 0, 0, 0 };
+
+ if (WinID == 0)
+ return; // do not hide, if we're playing at rootwin
+
+ colormap = DefaultColormap(disp, DefaultScreen(disp));
+ XAllocNamedColor(disp, colormap, "black", &black, &dummy);
+ bm_no = XCreateBitmapFromData(disp, win, bm_no_data, 8, 8);
+ no_ptr = XCreatePixmapCursor(disp, bm_no, bm_no, &black, &black, 0, 0);
+ XDefineCursor(disp, win, no_ptr);
+ XFreeCursor(disp, no_ptr);
+ if (bm_no != None)
+ XFreePixmap(disp, bm_no);
+}
+
+void vo_showcursor(Display * disp, Window win)
{
- assert( action == _NET_WM_STATE_REMOVE ||
- action == _NET_WM_STATE_ADD ||
- action == _NET_WM_STATE_TOGGLE );
-
- if ( vo_fs_type & vo_wm_FULLSCREEN )
- {
- XEvent xev;
-
- /* init X event structure for _NET_WM_FULLSCREEN client msg */
- xev.xclient.type = ClientMessage;
- xev.xclient.serial = 0;
- xev.xclient.send_event = True;
- xev.xclient.message_type = XInternAtom( mDisplay,
- "_NET_WM_STATE", False );
- xev.xclient.window = vo_window;
- xev.xclient.format = 32;
- xev.xclient.data.l[0] = action;
- xev.xclient.data.l[1] = XInternAtom( mDisplay,
- "_NET_WM_STATE_FULLSCREEN", False );
- xev.xclient.data.l[2] = 0;
- xev.xclient.data.l[3] = 0;
- xev.xclient.data.l[4] = 0;
-
- /* finally send that damn thing */
- if ( !XSendEvent( mDisplay, DefaultRootWindow( mDisplay ), False,
- SubstructureRedirectMask | SubstructureNotifyMask, &xev ) )
- {
- mp_msg( MSGT_VO,MSGL_ERR, MSGTR_EwmhFullscreenStateFailed );
- }
- }
-}
-
-void vo_hidecursor ( Display *disp , Window win )
-{
- Cursor no_ptr;
- Pixmap bm_no;
- XColor black,dummy;
- Colormap colormap;
- static unsigned char bm_no_data[] = { 0,0,0,0, 0,0,0,0 };
-
- if(WinID==0) return; // do not hide, if we're playing at rootwin
-
- colormap = DefaultColormap(disp,DefaultScreen(disp));
- XAllocNamedColor(disp,colormap,"black",&black,&dummy);
- bm_no = XCreateBitmapFromData(disp, win, bm_no_data, 8,8);
- no_ptr=XCreatePixmapCursor(disp, bm_no, bm_no,&black, &black,0, 0);
- XDefineCursor(disp,win,no_ptr);
- XFreeCursor( disp,no_ptr );
- if (bm_no != None)
- XFreePixmap(disp, bm_no);
-}
-
-void vo_showcursor( Display *disp, Window win )
-{
- if ( WinID==0 ) return;
- XDefineCursor( disp,win,0 );
+ if (WinID == 0)
+ return;
+ XDefineCursor(disp, win, 0);
}
-static int x11_errorhandler(Display *display, XErrorEvent *event)
+static int x11_errorhandler(Display * display, XErrorEvent * event)
{
#define MSGLEN 60
char msg[MSGLEN];
-
- XGetErrorText(display, event->error_code, (char *)&msg, MSGLEN);
-
- mp_msg(MSGT_VO,MSGL_ERR,"X11 error: %s\n", msg);
-
- mp_msg(MSGT_VO,MSGL_V,"Type: %x, display: %x, resourceid: %x, serial: %x\n",
- event->type, event->display, event->resourceid, event->serial);
- mp_msg(MSGT_VO,MSGL_V,"Error code: %x, request code: %x, minor code: %x\n",
- event->error_code, event->request_code, event->minor_code);
-
+
+ XGetErrorText(display, event->error_code, (char *) &msg, MSGLEN);
+
+ mp_msg(MSGT_VO, MSGL_ERR, "X11 error: %s\n", msg);
+
+ mp_msg(MSGT_VO, MSGL_V,
+ "Type: %x, display: %x, resourceid: %x, serial: %x\n",
+ event->type, event->display, event->resourceid, event->serial);
+ mp_msg(MSGT_VO, MSGL_V,
+ "Error code: %x, request code: %x, minor code: %x\n",
+ event->error_code, event->request_code, event->minor_code);
+
abort();
//exit_player("X11 error");
#undef MSGLEN
@@ -205,278 +210,314 @@
void fstype_help(void)
{
- mp_msg(MSGT_VO, MSGL_INFO, MSGTR_AvailableFsType);
-
- mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "none", "don't set fullscreen window layer");
- mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "layer", "use _WIN_LAYER hint with default layer");
- mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "layer=<0..15>", "use _WIN_LAYER hint with a given layer number");
- mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "netwm", "force NETWM style");
- mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "above", "use _NETWM_STATE_ABOVE hint if available");
- mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "below", "use _NETWM_STATE_BELOW hint if available");
- mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "fullscreen", "use _NETWM_STATE_FULLSCREEN hint if availale");
- mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "stays_on_top", "use _NETWM_STATE_STAYS_ON_TOP hint if available");
- mp_msg(MSGT_VO, MSGL_INFO, "You can also negate the settings with simply putting '-' in the beginning");
+ mp_msg(MSGT_VO, MSGL_INFO, MSGTR_AvailableFsType);
+
+ mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "none",
+ "don't set fullscreen window layer");
+ mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "layer",
+ "use _WIN_LAYER hint with default layer");
+ mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "layer=<0..15>",
+ "use _WIN_LAYER hint with a given layer number");
+ mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "netwm",
+ "force NETWM style");
+ mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "above",
+ "use _NETWM_STATE_ABOVE hint if available");
+ mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "below",
+ "use _NETWM_STATE_BELOW hint if available");
+ mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "fullscreen",
+ "use _NETWM_STATE_FULLSCREEN hint if availale");
+ mp_msg(MSGT_VO, MSGL_INFO, " %-15s %s\n", "stays_on_top",
+ "use _NETWM_STATE_STAYS_ON_TOP hint if available");
+ mp_msg(MSGT_VO, MSGL_INFO,
+ "You can also negate the settings with simply putting '-' in the beginning");
}
static void fstype_dump(int fstype)
{
if (fstype)
{
- mp_msg(MSGT_VO, MSGL_V, "[x11] Current fstype setting honours");
- if (fstype & vo_wm_LAYER)
- mp_msg(MSGT_VO, MSGL_V, " LAYER");
- if (fstype & vo_wm_FULLSCREEN)
- mp_msg(MSGT_VO, MSGL_V, " FULLSCREEN");
- if (fstype & vo_wm_STAYS_ON_TOP)
- mp_msg(MSGT_VO, MSGL_V, " STAYS_ON_TOP");
- if (fstype & vo_wm_ABOVE)
- mp_msg(MSGT_VO, MSGL_V, " ABOVE");
- if (fstype & vo_wm_BELOW)
- mp_msg(MSGT_VO, MSGL_V, " BELOW");
- mp_msg(MSGT_VO, MSGL_V, " X atoms\n");
- }
- else
- mp_msg(MSGT_VO, MSGL_V, "[x11] Current fstype setting doesn't honour any X atoms\n");
+ mp_msg(MSGT_VO, MSGL_V, "[x11] Current fstype setting honours");
+ if (fstype & vo_wm_LAYER)
+ mp_msg(MSGT_VO, MSGL_V, " LAYER");
+ if (fstype & vo_wm_FULLSCREEN)
+ mp_msg(MSGT_VO, MSGL_V, " FULLSCREEN");
+ if (fstype & vo_wm_STAYS_ON_TOP)
+ mp_msg(MSGT_VO, MSGL_V, " STAYS_ON_TOP");
+ if (fstype & vo_wm_ABOVE)
+ mp_msg(MSGT_VO, MSGL_V, " ABOVE");
+ if (fstype & vo_wm_BELOW)
+ mp_msg(MSGT_VO, MSGL_V, " BELOW");
+ mp_msg(MSGT_VO, MSGL_V, " X atoms\n");
+ } else
+ mp_msg(MSGT_VO, MSGL_V,
+ "[x11] Current fstype setting doesn't honour any X atoms\n");
}
-
+
static int net_wm_support_state_test(Atom atom)
{
#define NET_WM_STATE_TEST(x) { if (atom == XA_NET_WM_STATE_##x) { mp_msg( MSGT_VO,MSGL_V, "[x11] Detected wm supports " #x " state.\n" ); return vo_wm_##x; } }
-
- NET_WM_STATE_TEST(FULLSCREEN);
- NET_WM_STATE_TEST(ABOVE);
- NET_WM_STATE_TEST(STAYS_ON_TOP);
- NET_WM_STATE_TEST(BELOW);
- return 0;
-}
-
-static int x11_get_property(Atom type, Atom **args, unsigned long *nitems)
-{
- int format;
- unsigned long bytesafter;
-
- return (Success == XGetWindowProperty( mDisplay,mRootWin,type,0,16384,
- False,AnyPropertyType,&type,&format,nitems,&bytesafter,
- (unsigned char **) args ) && *nitems > 0 );
+
+ NET_WM_STATE_TEST(FULLSCREEN);
+ NET_WM_STATE_TEST(ABOVE);
+ NET_WM_STATE_TEST(STAYS_ON_TOP);
+ NET_WM_STATE_TEST(BELOW);
+ return 0;
+}
+
+static int x11_get_property(Atom type, Atom ** args, unsigned long *nitems)
+{
+ int format;
+ unsigned long bytesafter;
+
+ return (Success ==
+ XGetWindowProperty(mDisplay, mRootWin, type, 0, 16384, False,
+ AnyPropertyType, &type, &format, nitems,
+ &bytesafter, (unsigned char **) args)
+ && *nitems > 0);
}
static int vo_wm_detect(void)
{
- int i;
- int wm = 0;
- unsigned long nitems;
- Atom * args = NULL;
-
- if ( WinID >= 0 ) return 0;
-
-// -- supports layers
- if (x11_get_property(XA_WIN_PROTOCOLS, &args, &nitems))
- {
- mp_msg( MSGT_VO,MSGL_V,"[x11] Detected wm supports layers.\n" );
- for (i = 0; i < nitems; i++)
- {
- if ( args[i] == XA_WIN_LAYER) {
- wm |= vo_wm_LAYER;
- metacity_hack |= 1;
- } else
- // metacity is the only manager I know which reports support only for _WIN_LAYER
- // hint in _WIN_PROTOCOLS (what's more support for it is broken)
- metacity_hack |= 2;
- }
- XFree( args );
- if (wm && (metacity_hack == 1))
- {
- // metacity reports that it supports layers, but it is not really truth :-)
- wm ^= vo_wm_LAYER;
- mp_msg( MSGT_VO,MSGL_V,"[x11] Using workaround for Metacity bugs.\n" );
- }
- }
+ int i;
+ int wm = 0;
+ unsigned long nitems;
+ Atom *args = NULL;
+
+ if (WinID >= 0)
+ return 0;
+// -- supports layers
+ if (x11_get_property(XA_WIN_PROTOCOLS, &args, &nitems))
+ {
+ mp_msg(MSGT_VO, MSGL_V, "[x11] Detected wm supports layers.\n");
+ for (i = 0; i < nitems; i++)
+ {
+ if (args[i] == XA_WIN_LAYER)
+ {
+ wm |= vo_wm_LAYER;
+ metacity_hack |= 1;
+ } else
+ // metacity is the only manager I know which reports support only for _WIN_LAYER
+ // hint in _WIN_PROTOCOLS (what's more support for it is broken)
+ metacity_hack |= 2;
+ }
+ XFree(args);
+ if (wm && (metacity_hack == 1))
+ {
+ // metacity reports that it supports layers, but it is not really truth :-)
+ wm ^= vo_wm_LAYER;
+ mp_msg(MSGT_VO, MSGL_V,
+ "[x11] Using workaround for Metacity bugs.\n");
+ }
+ }
// --- netwm
- if (x11_get_property(XA_NET_SUPPORTED, &args, &nitems))
- {
- mp_msg( MSGT_VO,MSGL_V,"[x11] Detected wm supports NetWM.\n" );
- for (i = 0; i < nitems; i++)
- wm |= net_wm_support_state_test (args[i]);
- XFree( args );
+ if (x11_get_property(XA_NET_SUPPORTED, &args, &nitems))
+ {
+ mp_msg(MSGT_VO, MSGL_V, "[x11] Detected wm supports NetWM.\n");
+ for (i = 0; i < nitems; i++)
+ wm |= net_wm_support_state_test(args[i]);
+ XFree(args);
#if 0
- // ugly hack for broken OpenBox _NET_WM_STATE_FULLSCREEN support
- // (in their implementation it only changes internal state of window, nothing more!!!)
- if (wm & vo_wm_FULLSCREEN)
- {
- if (x11_get_property(XA_BLACKBOX_PID, &args, &nitems))
- {
- mp_msg( MSGT_VO,MSGL_V,"[x11] Detected wm is a broken OpenBox.\n" );
- wm ^= vo_wm_FULLSCREEN;
- }
- XFree (args);
- }
-#endif
- }
-
- if ( wm == 0 ) mp_msg( MSGT_VO,MSGL_V,"[x11] Unknown wm type...\n" );
- return wm;
-}
+ // ugly hack for broken OpenBox _NET_WM_STATE_FULLSCREEN support
+ // (in their implementation it only changes internal state of window, nothing more!!!)
+ if (wm & vo_wm_FULLSCREEN)
+ {
+ if (x11_get_property(XA_BLACKBOX_PID, &args, &nitems))
+ {
+ mp_msg(MSGT_VO, MSGL_V,
+ "[x11] Detected wm is a broken OpenBox.\n");
+ wm ^= vo_wm_FULLSCREEN;
+ }
+ XFree(args);
+ }
+#endif
+ }
+
+ if (wm == 0)
+ mp_msg(MSGT_VO, MSGL_V, "[x11] Unknown wm type...\n");
+ return wm;
+}
static void init_atoms(void)
{
- XA_INIT(_NET_SUPPORTED);
- XA_INIT(_NET_WM_STATE);
- XA_INIT(_NET_WM_STATE_FULLSCREEN);
- XA_INIT(_NET_WM_STATE_ABOVE);
- XA_INIT(_NET_WM_STATE_STAYS_ON_TOP);
- XA_INIT(_NET_WM_STATE_BELOW);
- XA_INIT(_NET_WM_PID);
- XA_INIT(_WIN_PROTOCOLS);
- XA_INIT(_WIN_LAYER);
- XA_INIT(_WIN_HINTS);
- XA_INIT(_BLACKBOX_PID);
+ XA_INIT(_NET_SUPPORTED);
+ XA_INIT(_NET_WM_STATE);
+ XA_INIT(_NET_WM_STATE_FULLSCREEN);
+ XA_INIT(_NET_WM_STATE_ABOVE);
+ XA_INIT(_NET_WM_STATE_STAYS_ON_TOP);
+ XA_INIT(_NET_WM_STATE_BELOW);
+ XA_INIT(_NET_WM_PID);
+ XA_INIT(_WIN_PROTOCOLS);
+ XA_INIT(_WIN_LAYER);
+ XA_INIT(_WIN_HINTS);
+ XA_INIT(_BLACKBOX_PID);
}
-int vo_init( void )
+int vo_init(void)
{
// int mScreen;
- int depth, bpp;
- unsigned int mask;
+ int depth, bpp;
+ unsigned int mask;
+
// char * DisplayName = ":0.0";
// Display * mDisplay;
- XImage * mXImage = NULL;
+ XImage *mXImage = NULL;
+
// Window mRootWin;
- XWindowAttributes attribs;
- char* dispName;
+ XWindowAttributes attribs;
+ char *dispName;
- if(vo_depthonscreen) return 1; // already called
+ if (vo_depthonscreen)
+ return 1; // already called
- XSetErrorHandler(x11_errorhandler);
+ XSetErrorHandler(x11_errorhandler);
#if 0
- if (!mDisplayName)
- if (!(mDisplayName=getenv("DISPLAY")))
- mDisplayName=strdup(":0.0");
+ if (!mDisplayName)
+ if (!(mDisplayName = getenv("DISPLAY")))
+ mDisplayName = strdup(":0.0");
#else
- dispName = XDisplayName(mDisplayName);
+ dispName = XDisplayName(mDisplayName);
#endif
- mp_msg(MSGT_VO,MSGL_V,"X11 opening display: %s\n", dispName);
+ mp_msg(MSGT_VO, MSGL_V, "X11 opening display: %s\n", dispName);
- mDisplay=XOpenDisplay(dispName);
- if ( !mDisplay )
- {
- mp_msg(MSGT_VO,MSGL_ERR,"vo: couldn't open the X11 display (%s)!\n",dispName );
- return 0;
- }
- mScreen=DefaultScreen( mDisplay ); // Screen ID.
- mRootWin=RootWindow( mDisplay,mScreen );// Root window ID.
+ mDisplay = XOpenDisplay(dispName);
+ if (!mDisplay)
+ {
+ mp_msg(MSGT_VO, MSGL_ERR,
+ "vo: couldn't open the X11 display (%s)!\n", dispName);
+ return 0;
+ }
+ mScreen = DefaultScreen(mDisplay); // Screen ID.
+ mRootWin = RootWindow(mDisplay, mScreen); // Root window ID.
+
+ init_atoms();
- init_atoms();
-
#ifdef HAVE_XINERAMA
- if(XineramaIsActive(mDisplay))
- {
- XineramaScreenInfo *screens;
- int num_screens;
-
- screens = XineramaQueryScreens(mDisplay, &num_screens);
- if(xinerama_screen >= num_screens) xinerama_screen = 0;
- if (! vo_screenwidth)
- vo_screenwidth=screens[xinerama_screen].width;
- if (! vo_screenheight)
- vo_screenheight=screens[xinerama_screen].height;
- xinerama_x = screens[xinerama_screen].x_org;
- xinerama_y = screens[xinerama_screen].y_org;
-
- XFree(screens);
- }
- else
+ if (XineramaIsActive(mDisplay))
+ {
+ XineramaScreenInfo *screens;
+ int num_screens;
+
+ screens = XineramaQueryScreens(mDisplay, &num_screens);
+ if (xinerama_screen >= num_screens)
+ xinerama_screen = 0;
+ if (!vo_screenwidth)
+ vo_screenwidth = screens[xinerama_screen].width;
+ if (!vo_screenheight)
+ vo_screenheight = screens[xinerama_screen].height;
+ xinerama_x = screens[xinerama_screen].x_org;
+ xinerama_y = screens[xinerama_screen].y_org;
+
+ XFree(screens);
+ } else
#endif
#ifdef HAVE_XF86VM
- {
- int clock;
- XF86VidModeGetModeLine( mDisplay,mScreen,&clock ,&modeline );
- if ( !vo_screenwidth ) vo_screenwidth=modeline.hdisplay;
- if ( !vo_screenheight ) vo_screenheight=modeline.vdisplay;
- }
-#endif
- {
- if (! vo_screenwidth)
- vo_screenwidth=DisplayWidth( mDisplay,mScreen );
- if (! vo_screenheight)
- vo_screenheight=DisplayHeight( mDisplay,mScreen );
- }
- // get color depth (from root window, or the best visual):
- XGetWindowAttributes(mDisplay, mRootWin, &attribs);
- depth=attribs.depth;
-
- if (depth != 15 && depth != 16 && depth != 24 && depth != 32) {
- Visual *visual;
-
- depth = vo_find_depth_from_visuals(mDisplay, mScreen, &visual);
- if (depth != -1)
- mXImage=XCreateImage(mDisplay, visual, depth, ZPixmap,
- 0, NULL, 1, 1, 8, 1);
- } else
- mXImage=XGetImage( mDisplay,mRootWin,0,0,1,1,AllPlanes,ZPixmap );
-
- vo_depthonscreen = depth; // display depth on screen
-
- // get bits/pixel from XImage structure:
- if (mXImage == NULL) {
- mask = 0;
- } else {
- /*
- * for the depth==24 case, the XImage structures might use
- * 24 or 32 bits of data per pixel. The global variable
- * vo_depthonscreen stores the amount of data per pixel in the
- * XImage structure!
- *
- * Maybe we should rename vo_depthonscreen to (or add) vo_bpp?
- */
- bpp=mXImage->bits_per_pixel;
- if((vo_depthonscreen+7)/8 != (bpp+7)/8) vo_depthonscreen=bpp; // by A'rpi
- mask=mXImage->red_mask|mXImage->green_mask|mXImage->blue_mask;
- mp_msg(MSGT_VO,MSGL_V,"vo: X11 color mask: %X (R:%lX G:%lX B:%lX)\n",
- mask,mXImage->red_mask,mXImage->green_mask,mXImage->blue_mask);
- XDestroyImage( mXImage );
- }
- if(((vo_depthonscreen+7)/8)==2){
- if(mask==0x7FFF) vo_depthonscreen=15; else
- if(mask==0xFFFF) vo_depthonscreen=16;
- }
+ {
+ int clock;
+
+ XF86VidModeGetModeLine(mDisplay, mScreen, &clock, &modeline);
+ if (!vo_screenwidth)
+ vo_screenwidth = modeline.hdisplay;
+ if (!vo_screenheight)
+ vo_screenheight = modeline.vdisplay;
+ }
+#endif
+ {
+ if (!vo_screenwidth)
+ vo_screenwidth = DisplayWidth(mDisplay, mScreen);
+ if (!vo_screenheight)
+ vo_screenheight = DisplayHeight(mDisplay, mScreen);
+ }
+ // get color depth (from root window, or the best visual):
+ XGetWindowAttributes(mDisplay, mRootWin, &attribs);
+ depth = attribs.depth;
+
+ if (depth != 15 && depth != 16 && depth != 24 && depth != 32)
+ {
+ Visual *visual;
+
+ depth = vo_find_depth_from_visuals(mDisplay, mScreen, &visual);
+ if (depth != -1)
+ mXImage = XCreateImage(mDisplay, visual, depth, ZPixmap,
+ 0, NULL, 1, 1, 8, 1);
+ } else
+ mXImage =
+ XGetImage(mDisplay, mRootWin, 0, 0, 1, 1, AllPlanes, ZPixmap);
+
+ vo_depthonscreen = depth; // display depth on screen
+
+ // get bits/pixel from XImage structure:
+ if (mXImage == NULL)
+ {
+ mask = 0;
+ } else
+ {
+ /*
+ * for the depth==24 case, the XImage structures might use
+ * 24 or 32 bits of data per pixel. The global variable
+ * vo_depthonscreen stores the amount of data per pixel in the
+ * XImage structure!
+ *
+ * Maybe we should rename vo_depthonscreen to (or add) vo_bpp?
+ */
+ bpp = mXImage->bits_per_pixel;
+ if ((vo_depthonscreen + 7) / 8 != (bpp + 7) / 8)
+ vo_depthonscreen = bpp; // by A'rpi
+ mask =
+ mXImage->red_mask | mXImage->green_mask | mXImage->blue_mask;
+ mp_msg(MSGT_VO, MSGL_V,
+ "vo: X11 color mask: %X (R:%lX G:%lX B:%lX)\n", mask,
+ mXImage->red_mask, mXImage->green_mask, mXImage->blue_mask);
+ XDestroyImage(mXImage);
+ }
+ if (((vo_depthonscreen + 7) / 8) == 2)
+ {
+ if (mask == 0x7FFF)
+ vo_depthonscreen = 15;
+ else if (mask == 0xFFFF)
+ vo_depthonscreen = 16;
+ }
// XCloseDisplay( mDisplay );
/* slightly improved local display detection AST */
- if ( strncmp(dispName, "unix:", 5) == 0)
- dispName += 4;
- else if ( strncmp(dispName, "localhost:", 10) == 0)
- dispName += 9;
- if (*dispName==':' && atoi(dispName+1)<10) mLocalDisplay=1; else mLocalDisplay=0;
- mp_msg(MSGT_VO,MSGL_INFO,"vo: X11 running at %dx%d with depth %d and %d bpp (\"%s\" => %s display)\n",
- vo_screenwidth,vo_screenheight,
- depth, vo_depthonscreen,
- dispName,mLocalDisplay?"local":"remote");
-
- vo_wm_type=vo_wm_detect();
-
- vo_fs_type=vo_x11_get_fs_type(vo_wm_type);
-
- fstype_dump(vo_fs_type);
-
- saver_off(mDisplay);
- return 1;
-}
-
-void vo_uninit( void )
-{
- if (!mDisplay)
- {
- mp_msg(MSGT_VO, MSGL_V, "vo: x11 uninit called but X11 not inited..\n");
- return;
- }
+ if (strncmp(dispName, "unix:", 5) == 0)
+ dispName += 4;
+ else if (strncmp(dispName, "localhost:", 10) == 0)
+ dispName += 9;
+ if (*dispName == ':' && atoi(dispName + 1) < 10)
+ mLocalDisplay = 1;
+ else
+ mLocalDisplay = 0;
+ mp_msg(MSGT_VO, MSGL_INFO,
+ "vo: X11 running at %dx%d with depth %d and %d bpp (\"%s\" => %s display)\n",
+ vo_screenwidth, vo_screenheight, depth, vo_depthonscreen,
+ dispName, mLocalDisplay ? "local" : "remote");
+
+ vo_wm_type = vo_wm_detect();
+
+ vo_fs_type = vo_x11_get_fs_type(vo_wm_type);
+
+ fstype_dump(vo_fs_type);
+
+ saver_off(mDisplay);
+ return 1;
+}
+
+void vo_uninit(void)
+{
+ if (!mDisplay)
+ {
+ mp_msg(MSGT_VO, MSGL_V,
+ "vo: x11 uninit called but X11 not inited..\n");
+ return;
+ }
// if( !vo_depthonscreen ) return;
- mp_msg(MSGT_VO,MSGL_V,"vo: uninit ...\n" );
- XSetErrorHandler(NULL);
- XCloseDisplay( mDisplay );
- vo_depthonscreen = 0;
- mDisplay=NULL;
+ mp_msg(MSGT_VO, MSGL_V, "vo: uninit ...\n");
+ XSetErrorHandler(NULL);
+ XCloseDisplay(mDisplay);
+ vo_depthonscreen = 0;
+ mDisplay = NULL;
}
#include "../osdep/keycodes.h"
@@ -485,120 +526,285 @@
extern void mplayer_put_key(int code);
#ifdef XF86XK_AudioPause
-void vo_x11_putkey_ext(int keysym){
- switch ( keysym )
- {
- case XF86XK_AudioPause: mplayer_put_key(KEY_XF86_PAUSE); break;
- case XF86XK_AudioStop: mplayer_put_key(KEY_XF86_STOP); break;
- case XF86XK_AudioPrev: mplayer_put_key(KEY_XF86_PREV); break;
- case XF86XK_AudioNext: mplayer_put_key(KEY_XF86_NEXT); break;
- default: break;
- }
-}
-#endif
-
-void vo_x11_putkey(int key){
- switch ( key )
- {
- case wsLeft: mplayer_put_key(KEY_LEFT); break;
- case wsRight: mplayer_put_key(KEY_RIGHT); break;
- case wsUp: mplayer_put_key(KEY_UP); break;
- case wsDown: mplayer_put_key(KEY_DOWN); break;
- case wsSpace: mplayer_put_key(' '); break;
- case wsEscape: mplayer_put_key(KEY_ESC); break;
- case wsEnter: mplayer_put_key(KEY_ENTER); break;
- case wsBackSpace: mplayer_put_key(KEY_BS); break;
- case wsDelete: mplayer_put_key(KEY_DELETE); break;
- case wsInsert: mplayer_put_key(KEY_INSERT); break;
- case wsHome: mplayer_put_key(KEY_HOME); break;
- case wsEnd: mplayer_put_key(KEY_END); break;
- case wsPageUp: mplayer_put_key(KEY_PAGE_UP); break;
- case wsPageDown: mplayer_put_key(KEY_PAGE_DOWN); break;
- case wsF1: mplayer_put_key(KEY_F+1); break;
- case wsF2: mplayer_put_key(KEY_F+2); break;
- case wsF3: mplayer_put_key(KEY_F+3); break;
- case wsF4: mplayer_put_key(KEY_F+4); break;
- case wsF5: mplayer_put_key(KEY_F+5); break;
- case wsF6: mplayer_put_key(KEY_F+6); break;
- case wsF7: mplayer_put_key(KEY_F+7); break;
- case wsF8: mplayer_put_key(KEY_F+8); break;
- case wsF9: mplayer_put_key(KEY_F+9); break;
- case wsF10: mplayer_put_key(KEY_F+10); break;
- case wsF11: mplayer_put_key(KEY_F+11); break;
- case wsF12: mplayer_put_key(KEY_F+12); break;
- case wsq:
- case wsQ: mplayer_put_key('q'); break;
- case wsp:
- case wsP: mplayer_put_key('p'); break;
- case wsMinus:
- case wsGrayMinus: mplayer_put_key('-'); break;
- case wsPlus:
- case wsGrayPlus: mplayer_put_key('+'); break;
- case wsGrayMul:
- case wsMul: mplayer_put_key('*'); break;
- case wsGrayDiv:
- case wsDiv: mplayer_put_key('/'); break;
- case wsLess: mplayer_put_key('<'); break;
- case wsMore: mplayer_put_key('>'); break;
- case wsGray0: mplayer_put_key(KEY_KP0); break;
- case wsGrayEnd:
- case wsGray1: mplayer_put_key(KEY_KP1); break;
- case wsGrayDown:
- case wsGray2: mplayer_put_key(KEY_KP2); break;
- case wsGrayPgDn:
- case wsGray3: mplayer_put_key(KEY_KP3); break;
- case wsGrayLeft:
- case wsGray4: mplayer_put_key(KEY_KP4); break;
- case wsGray5Dup:
- case wsGray5: mplayer_put_key(KEY_KP5); break;
- case wsGrayRight:
- case wsGray6: mplayer_put_key(KEY_KP6); break;
- case wsGrayHome:
- case wsGray7: mplayer_put_key(KEY_KP7); break;
- case wsGrayUp:
- case wsGray8: mplayer_put_key(KEY_KP8); break;
- case wsGrayPgUp:
- case wsGray9: mplayer_put_key(KEY_KP9); break;
- case wsGrayDecimal: mplayer_put_key(KEY_KPDEC); break;
- case wsGrayInsert: mplayer_put_key(KEY_KPINS); break;
- case wsGrayDelete: mplayer_put_key(KEY_KPDEL); break;
- case wsGrayEnter: mplayer_put_key(KEY_KPENTER); break;
- case wsm:
- case wsM: mplayer_put_key('m'); break;
- case wso:
- case wsO: mplayer_put_key('o'); break;
-
- case wsGrave: mplayer_put_key('`'); break;
- case wsTilde: mplayer_put_key('~'); break;
- case wsExclSign: mplayer_put_key('!'); break;
- case wsAt: mplayer_put_key('@'); break;
- case wsHash: mplayer_put_key('#'); break;
- case wsDollar: mplayer_put_key('$'); break;
- case wsPercent: mplayer_put_key('%'); break;
- case wsCircumflex: mplayer_put_key('^'); break;
- case wsAmpersand: mplayer_put_key('&'); break;
- case wsobracket: mplayer_put_key('('); break;
- case wscbracket: mplayer_put_key(')'); break;
- case wsUnder: mplayer_put_key('_'); break;
- case wsocbracket: mplayer_put_key('{'); break;
- case wsccbracket: mplayer_put_key('}'); break;
- case wsColon: mplayer_put_key(':'); break;
- case wsSemicolon: mplayer_put_key(';'); break;
- case wsDblQuote: mplayer_put_key('\"'); break;
- case wsAcute: mplayer_put_key('\''); break;
- case wsComma: mplayer_put_key(','); break;
- case wsPoint: mplayer_put_key('.'); break;
- case wsQuestSign: mplayer_put_key('?'); break;
- case wsBSlash: mplayer_put_key('\\'); break;
- case wsPipe: mplayer_put_key('|'); break;
- case wsEqual: mplayer_put_key('='); break;
- case wsosbrackets: mplayer_put_key('['); break;
- case wscsbrackets: mplayer_put_key(']'); break;
-
-
- default: if((key>='a' && key<='z')||(key>='A' && key<='Z')||
- (key>='0' && key<='9')) mplayer_put_key(key);
- }
+void vo_x11_putkey_ext(int keysym)
+{
+ switch (keysym)
+ {
+ case XF86XK_AudioPause:
+ mplayer_put_key(KEY_XF86_PAUSE);
+ break;
+ case XF86XK_AudioStop:
+ mplayer_put_key(KEY_XF86_STOP);
+ break;
+ case XF86XK_AudioPrev:
+ mplayer_put_key(KEY_XF86_PREV);
+ break;
+ case XF86XK_AudioNext:
+ mplayer_put_key(KEY_XF86_NEXT);
+ break;
+ default:
+ break;
+ }
+}
+#endif
+
+void vo_x11_putkey(int key)
+{
+ switch (key)
+ {
+ case wsLeft:
+ mplayer_put_key(KEY_LEFT);
+ break;
+ case wsRight:
+ mplayer_put_key(KEY_RIGHT);
+ break;
+ case wsUp:
+ mplayer_put_key(KEY_UP);
+ break;
+ case wsDown:
+ mplayer_put_key(KEY_DOWN);
+ break;
+ case wsSpace:
+ mplayer_put_key(' ');
+ break;
+ case wsEscape:
+ mplayer_put_key(KEY_ESC);
+ break;
+ case wsEnter:
+ mplayer_put_key(KEY_ENTER);
+ break;
+ case wsBackSpace:
+ mplayer_put_key(KEY_BS);
+ break;
+ case wsDelete:
+ mplayer_put_key(KEY_DELETE);
+ break;
+ case wsInsert:
+ mplayer_put_key(KEY_INSERT);
+ break;
+ case wsHome:
+ mplayer_put_key(KEY_HOME);
+ break;
+ case wsEnd:
+ mplayer_put_key(KEY_END);
+ break;
+ case wsPageUp:
+ mplayer_put_key(KEY_PAGE_UP);
+ break;
+ case wsPageDown:
+ mplayer_put_key(KEY_PAGE_DOWN);
+ break;
+ case wsF1:
+ mplayer_put_key(KEY_F + 1);
+ break;
+ case wsF2:
+ mplayer_put_key(KEY_F + 2);
+ break;
+ case wsF3:
+ mplayer_put_key(KEY_F + 3);
+ break;
+ case wsF4:
+ mplayer_put_key(KEY_F + 4);
+ break;
+ case wsF5:
+ mplayer_put_key(KEY_F + 5);
+ break;
+ case wsF6:
+ mplayer_put_key(KEY_F + 6);
+ break;
+ case wsF7:
+ mplayer_put_key(KEY_F + 7);
+ break;
+ case wsF8:
+ mplayer_put_key(KEY_F + 8);
+ break;
+ case wsF9:
+ mplayer_put_key(KEY_F + 9);
+ break;
+ case wsF10:
+ mplayer_put_key(KEY_F + 10);
+ break;
+ case wsF11:
+ mplayer_put_key(KEY_F + 11);
+ break;
+ case wsF12:
+ mplayer_put_key(KEY_F + 12);
+ break;
+ case wsq:
+ case wsQ:
+ mplayer_put_key('q');
+ break;
+ case wsp:
+ case wsP:
+ mplayer_put_key('p');
+ break;
+ case wsMinus:
+ case wsGrayMinus:
+ mplayer_put_key('-');
+ break;
+ case wsPlus:
+ case wsGrayPlus:
+ mplayer_put_key('+');
+ break;
+ case wsGrayMul:
+ case wsMul:
+ mplayer_put_key('*');
+ break;
+ case wsGrayDiv:
+ case wsDiv:
+ mplayer_put_key('/');
+ break;
+ case wsLess:
+ mplayer_put_key('<');
+ break;
+ case wsMore:
+ mplayer_put_key('>');
+ break;
+ case wsGray0:
+ mplayer_put_key(KEY_KP0);
+ break;
+ case wsGrayEnd:
+ case wsGray1:
+ mplayer_put_key(KEY_KP1);
+ break;
+ case wsGrayDown:
+ case wsGray2:
+ mplayer_put_key(KEY_KP2);
+ break;
+ case wsGrayPgDn:
+ case wsGray3:
+ mplayer_put_key(KEY_KP3);
+ break;
+ case wsGrayLeft:
+ case wsGray4:
+ mplayer_put_key(KEY_KP4);
+ break;
+ case wsGray5Dup:
+ case wsGray5:
+ mplayer_put_key(KEY_KP5);
+ break;
+ case wsGrayRight:
+ case wsGray6:
+ mplayer_put_key(KEY_KP6);
+ break;
+ case wsGrayHome:
+ case wsGray7:
+ mplayer_put_key(KEY_KP7);
+ break;
+ case wsGrayUp:
+ case wsGray8:
+ mplayer_put_key(KEY_KP8);
+ break;
+ case wsGrayPgUp:
+ case wsGray9:
+ mplayer_put_key(KEY_KP9);
+ break;
+ case wsGrayDecimal:
+ mplayer_put_key(KEY_KPDEC);
+ break;
+ case wsGrayInsert:
+ mplayer_put_key(KEY_KPINS);
+ break;
+ case wsGrayDelete:
+ mplayer_put_key(KEY_KPDEL);
+ break;
+ case wsGrayEnter:
+ mplayer_put_key(KEY_KPENTER);
+ break;
+ case wsm:
+ case wsM:
+ mplayer_put_key('m');
+ break;
+ case wso:
+ case wsO:
+ mplayer_put_key('o');
+ break;
+
+ case wsGrave:
+ mplayer_put_key('`');
+ break;
+ case wsTilde:
+ mplayer_put_key('~');
+ break;
+ case wsExclSign:
+ mplayer_put_key('!');
+ break;
+ case wsAt:
+ mplayer_put_key('@');
+ break;
+ case wsHash:
+ mplayer_put_key('#');
+ break;
+ case wsDollar:
+ mplayer_put_key('$');
+ break;
+ case wsPercent:
+ mplayer_put_key('%');
+ break;
+ case wsCircumflex:
+ mplayer_put_key('^');
+ break;
+ case wsAmpersand:
+ mplayer_put_key('&');
+ break;
+ case wsobracket:
+ mplayer_put_key('(');
+ break;
+ case wscbracket:
+ mplayer_put_key(')');
+ break;
+ case wsUnder:
+ mplayer_put_key('_');
+ break;
+ case wsocbracket:
+ mplayer_put_key('{');
+ break;
+ case wsccbracket:
+ mplayer_put_key('}');
+ break;
+ case wsColon:
+ mplayer_put_key(':');
+ break;
+ case wsSemicolon:
+ mplayer_put_key(';');
+ break;
+ case wsDblQuote:
+ mplayer_put_key('\"');
+ break;
+ case wsAcute:
+ mplayer_put_key('\'');
+ break;
+ case wsComma:
+ mplayer_put_key(',');
+ break;
+ case wsPoint:
+ mplayer_put_key('.');
+ break;
+ case wsQuestSign:
+ mplayer_put_key('?');
+ break;
+ case wsBSlash:
+ mplayer_put_key('\\');
+ break;
+ case wsPipe:
+ mplayer_put_key('|');
+ break;
+ case wsEqual:
+ mplayer_put_key('=');
+ break;
+ case wsosbrackets:
+ mplayer_put_key('[');
+ break;
+ case wscsbrackets:
+ mplayer_put_key(']');
+ break;
+
+
+ default:
+ if ((key >= 'a' && key <= 'z') || (key >= 'A' && key <= 'Z') ||
+ (key >= '0' && key <= '9'))
+ mplayer_put_key(key);
+ }
}
@@ -635,525 +841,634 @@
typedef struct
{
- long flags;
- long functions;
- long decorations;
- long input_mode;
- long state;
+ long flags;
+ long functions;
+ long decorations;
+ long input_mode;
+ long state;
} MotifWmHints;
extern MotifWmHints vo_MotifWmHints;
-extern Atom vo_MotifHints;
-extern int vo_depthonscreen;
-extern int vo_screenwidth;
-extern int vo_screenheight;
-
-static MotifWmHints vo_MotifWmHints;
-static Atom vo_MotifHints = None;
-
-void vo_x11_decoration( Display * vo_Display,Window w,int d )
-{
- static unsigned int olddecor = MWM_DECOR_ALL;
- static unsigned int oldfuncs = MWM_FUNC_MOVE | MWM_FUNC_CLOSE | MWM_FUNC_MINIMIZE | MWM_FUNC_MAXIMIZE | MWM_FUNC_RESIZE;
- Atom mtype;
- int mformat;
- unsigned long mn,mb;
- if ( !WinID ) return;
-
- if(vo_fsmode&8){
- XSetTransientForHint (vo_Display, w, RootWindow(vo_Display,mScreen));
- }
-
- vo_MotifHints=XInternAtom( vo_Display,"_MOTIF_WM_HINTS",0 );
- if ( vo_MotifHints != None )
- {
- if (!d) {
- MotifWmHints *mhints=NULL;
- XGetWindowProperty(vo_Display,w, vo_MotifHints, 0, 20, False,
- vo_MotifHints, &mtype, &mformat, &mn,
- &mb, (unsigned char **)&mhints) ;
- if (mhints){
- if (mhints->flags & MWM_HINTS_DECORATIONS)
- olddecor = mhints->decorations;
- if (mhints->flags & MWM_HINTS_FUNCTIONS)
- oldfuncs = mhints->functions;
- XFree (mhints);
- }
- }
-
- memset( &vo_MotifWmHints,0,sizeof( MotifWmHints ) );
- vo_MotifWmHints.flags=MWM_HINTS_FUNCTIONS | MWM_HINTS_DECORATIONS;
- if ( d )
+extern Atom vo_MotifHints;
+extern int vo_depthonscreen;
+extern int vo_screenwidth;
+extern int vo_screenheight;
+
+static MotifWmHints vo_MotifWmHints;
+static Atom vo_MotifHints = None;
+
+void vo_x11_decoration(Display * vo_Display, Window w, int d)
+{
+ static unsigned int olddecor = MWM_DECOR_ALL;
+ static unsigned int oldfuncs =
+ MWM_FUNC_MOVE | MWM_FUNC_CLOSE | MWM_FUNC_MINIMIZE |
+ MWM_FUNC_MAXIMIZE | MWM_FUNC_RESIZE;
+ Atom mtype;
+ int mformat;
+ unsigned long mn, mb;
+
+ if (!WinID)
+ return;
+
+ if (vo_fsmode & 8)
{
- vo_MotifWmHints.functions= oldfuncs;
- d=olddecor;
+ XSetTransientForHint(vo_Display, w,
+ RootWindow(vo_Display, mScreen));
}
+
+ vo_MotifHints = XInternAtom(vo_Display, "_MOTIF_WM_HINTS", 0);
+ if (vo_MotifHints != None)
+ {
+ if (!d)
+ {
+ MotifWmHints *mhints = NULL;
+
+ XGetWindowProperty(vo_Display, w, vo_MotifHints, 0, 20, False,
+ vo_MotifHints, &mtype, &mformat, &mn,
+ &mb, (unsigned char **) &mhints);
+ if (mhints)
+ {
+ if (mhints->flags & MWM_HINTS_DECORATIONS)
+ olddecor = mhints->decorations;
+ if (mhints->flags & MWM_HINTS_FUNCTIONS)
+ oldfuncs = mhints->functions;
+ XFree(mhints);
+ }
+ }
+
+ memset(&vo_MotifWmHints, 0, sizeof(MotifWmHints));
+ vo_MotifWmHints.flags =
+ MWM_HINTS_FUNCTIONS | MWM_HINTS_DECORATIONS;
+ if (d)
+ {
+ vo_MotifWmHints.functions = oldfuncs;
+ d = olddecor;
+ }
#if 0
- vo_MotifWmHints.decorations=d|((vo_fsmode&2)?0:MWM_DECOR_MENU);
+ vo_MotifWmHints.decorations =
+ d | ((vo_fsmode & 2) ? 0 : MWM_DECOR_MENU);
#else
- vo_MotifWmHints.decorations=d|((vo_fsmode&2)?MWM_DECOR_MENU:0);
+ vo_MotifWmHints.decorations =
+ d | ((vo_fsmode & 2) ? MWM_DECOR_MENU : 0);
#endif
- XChangeProperty( vo_Display,w,vo_MotifHints,vo_MotifHints,32,
- PropModeReplace,(unsigned char *)&vo_MotifWmHints,(vo_fsmode&4)?4:5 );
- }
+ XChangeProperty(vo_Display, w, vo_MotifHints, vo_MotifHints, 32,
+ PropModeReplace,
+ (unsigned char *) &vo_MotifWmHints,
+ (vo_fsmode & 4) ? 4 : 5);
+ }
}
-void vo_x11_classhint( Display * display,Window window,char *name ){
- XClassHint wmClass;
- pid_t pid=getpid();
- wmClass.res_name = name;
- wmClass.res_class = "MPlayer";
- XSetClassHint(display,window,&wmClass);
- XChangeProperty(display,window, XA_NET_WM_PID, XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&pid, 1);
+void vo_x11_classhint(Display * display, Window window, char *name)
+{
+ XClassHint wmClass;
+ pid_t pid = getpid();
+
+ wmClass.res_name = name;
+ wmClass.res_class = "MPlayer";
+ XSetClassHint(display, window, &wmClass);
+ XChangeProperty(display, window, XA_NET_WM_PID, XA_CARDINAL, 32,
+ PropModeReplace, (unsigned char *) &pid, 1);
}
-Window vo_window = None;
-GC vo_gc = NULL;
-GC f_gc = NULL;
+Window vo_window = None;
+GC vo_gc = NULL;
+GC f_gc = NULL;
XSizeHints vo_hint;
#ifdef HAVE_NEW_GUI
- void vo_setwindow( Window w,GC g ) {
- vo_window=w; vo_gc=g;
- }
+void vo_setwindow(Window w, GC g)
+{
+ vo_window = w;
+ vo_gc = g;
+}
#endif
void vo_x11_uninit()
{
saver_on(mDisplay);
- if(vo_window!=None) vo_showcursor( mDisplay,vo_window );
-
- if (f_gc) { XFreeGC(mDisplay, f_gc); f_gc = NULL; }
+ if (vo_window != None)
+ vo_showcursor(mDisplay, vo_window);
+ if (f_gc)
+ {
+ XFreeGC(mDisplay, f_gc);
+ f_gc = NULL;
+ }
#ifdef HAVE_NEW_GUI
/* destroy window only if it's not controlled by GUI */
- if ( !use_gui )
+ if (!use_gui)
#endif
{
- if(vo_gc){
- XSetBackground( mDisplay,vo_gc,0 );
- XFreeGC( mDisplay,vo_gc );
- vo_gc=NULL;
- }
- if(vo_window!=None){
- XClearWindow( mDisplay,vo_window );
- if (WinID < 0){
- XEvent xev;
- XUnmapWindow( mDisplay,vo_window );
- XDestroyWindow(mDisplay, vo_window);
- do { XNextEvent( mDisplay,&xev ); } while ( xev.type != DestroyNotify || xev.xdestroywindow.event != vo_window );
- }
- vo_window=None;
- }
- vo_fs=0;
- vo_old_width=vo_old_height=0;
+ if (vo_gc)
+ {
+ XSetBackground(mDisplay, vo_gc, 0);
+ XFreeGC(mDisplay, vo_gc);
+ vo_gc = NULL;
+ }
+ if (vo_window != None)
+ {
+ XClearWindow(mDisplay, vo_window);
+ if (WinID < 0)
+ {
+ XEvent xev;
+
+ XUnmapWindow(mDisplay, vo_window);
+ XDestroyWindow(mDisplay, vo_window);
+ do
+ {
+ XNextEvent(mDisplay, &xev);
+ }
+ while (xev.type != DestroyNotify
+ || xev.xdestroywindow.event != vo_window);
+ }
+ vo_window = None;
+ }
+ vo_fs = 0;
+ vo_old_width = vo_old_height = 0;
}
}
- int vo_mouse_timer_const = 30;
+int vo_mouse_timer_const = 30;
static int vo_mouse_counter = 30;
-int vo_x11_check_events(Display *mydisplay){
- int ret=0;
- XEvent Event;
- char buf[100];
- KeySym keySym;
- static XComposeStatus stat;
+int vo_x11_check_events(Display * mydisplay)
+{
+ int ret = 0;
+ XEvent Event;
+ char buf[100];
+ KeySym keySym;
+ static XComposeStatus stat;
// unsigned long vo_KeyTable[512];
- if ( ( vo_mouse_autohide )&&( --vo_mouse_counter == 0 ) ) vo_hidecursor( mydisplay,vo_window );
+ if ((vo_mouse_autohide) && (--vo_mouse_counter == 0))
+ vo_hidecursor(mydisplay, vo_window);
- while ( XPending( mydisplay ) )
- {
- XNextEvent( mydisplay,&Event );
- #ifdef HAVE_NEW_GUI
- if ( use_gui )
- {
- guiGetEvent( 0,(char*)&Event );
- if ( vo_window != Event.xany.window ) continue;
- }
- #endif
+ while (XPending(mydisplay))
+ {
+ XNextEvent(mydisplay, &Event);
+#ifdef HAVE_NEW_GUI
+ if (use_gui)
+ {
+ guiGetEvent(0, (char *) &Event);
+ if (vo_window != Event.xany.window)
+ continue;
+ }
+#endif
// printf("\rEvent.type=%X \n",Event.type);
- switch( Event.type )
- {
- case Expose:
- ret|=VO_EVENT_EXPOSE;
- break;
- case ConfigureNotify:
-// if (!vo_fs && (Event.xconfigure.width == vo_screenwidth || Event.xconfigure.height == vo_screenheight)) break;
-// if (vo_fs && Event.xconfigure.width != vo_screenwidth && Event.xconfigure.height != vo_screenheight) break;
- if ( vo_window == None ) break;
- vo_dwidth=Event.xconfigure.width;
- vo_dheight=Event.xconfigure.height;
+ switch (Event.type)
+ {
+ case Expose:
+ ret |= VO_EVENT_EXPOSE;
+ break;
+ case ConfigureNotify:
+// if (!vo_fs && (Event.xconfigure.width == vo_screenwidth || Event.xconfigure.height == vo_screenheight)) break;
+// if (vo_fs && Event.xconfigure.width != vo_screenwidth && Event.xconfigure.height != vo_screenheight) break;
+ if (vo_window == None)
+ break;
+ vo_dwidth = Event.xconfigure.width;
+ vo_dheight = Event.xconfigure.height;
#if 0
- /* when resizing, x and y are zero :( */
- vo_dx=Event.xconfigure.x;
- vo_dy=Event.xconfigure.y;
+ /* when resizing, x and y are zero :( */
+ vo_dx = Event.xconfigure.x;
+ vo_dy = Event.xconfigure.y;
#else
- {
- Window root;
- int foo;
- Window win;
- XGetGeometry(mydisplay, vo_window, &root, &foo, &foo,
- &foo/*width*/, &foo/*height*/, &foo, &foo);
- XTranslateCoordinates(mydisplay, vo_window, root, 0, 0,
- &vo_dx, &vo_dy, &win);
- }
-#endif
- ret|=VO_EVENT_RESIZE;
- break;
- case KeyPress:
- {
- int key;
- XLookupString( &Event.xkey,buf,sizeof(buf),&keySym,&stat );
- #ifdef XF86XK_AudioPause
- vo_x11_putkey_ext( keySym );
- #endif
- key=( (keySym&0xff00) != 0?( (keySym&0x00ff) + 256 ):( keySym ) );
- #ifdef HAVE_NEW_GUI
- if ( ( use_gui )&&( key == wsEnter ) ) break;
- #endif
- vo_x11_putkey( key );
- ret|=VO_EVENT_KEYPRESS;
- }
- break;
- case MotionNotify:
- if ( vo_mouse_autohide ) { vo_showcursor( mydisplay,vo_window ); vo_mouse_counter=vo_mouse_timer_const; }
- break;
- case ButtonPress:
- if ( vo_mouse_autohide ) { vo_showcursor( mydisplay,vo_window ); vo_mouse_counter=vo_mouse_timer_const; }
- // Ignore mouse whell press event
- if(Event.xbutton.button > 3) {
- mplayer_put_key(MOUSE_BTN0+Event.xbutton.button-1);
- break;
- }
- #ifdef HAVE_NEW_GUI
- // Ignor mouse button 1 - 3 under gui
- if ( use_gui && ( Event.xbutton.button >= 1 )&&( Event.xbutton.button <= 3 ) ) break;
- #endif
- mplayer_put_key((MOUSE_BTN0+Event.xbutton.button-1)|MP_KEY_DOWN);
- break;
- case ButtonRelease:
- if ( vo_mouse_autohide ) { vo_showcursor( mydisplay,vo_window ); vo_mouse_counter=vo_mouse_timer_const; }
- #ifdef HAVE_NEW_GUI
- // Ignor mouse button 1 - 3 under gui
- if ( use_gui && ( Event.xbutton.button >= 1 )&&( Event.xbutton.button <= 3 ) ) break;
- #endif
- mplayer_put_key(MOUSE_BTN0+Event.xbutton.button-1);
- break;
- case PropertyNotify:
- {
- char * name = XGetAtomName( mydisplay,Event.xproperty.atom );
-
- if ( !name ) break;
-
+ {
+ Window root;
+ int foo;
+ Window win;
+
+ XGetGeometry(mydisplay, vo_window, &root, &foo, &foo,
+ &foo /*width */ , &foo /*height */ , &foo,
+ &foo);
+ XTranslateCoordinates(mydisplay, vo_window, root, 0, 0,
+ &vo_dx, &vo_dy, &win);
+ }
+#endif
+ ret |= VO_EVENT_RESIZE;
+ break;
+ case KeyPress:
+ {
+ int key;
+
+ XLookupString(&Event.xkey, buf, sizeof(buf), &keySym,
+ &stat);
+#ifdef XF86XK_AudioPause
+ vo_x11_putkey_ext(keySym);
+#endif
+ key =
+ ((keySym & 0xff00) !=
+ 0 ? ((keySym & 0x00ff) + 256) : (keySym));
+#ifdef HAVE_NEW_GUI
+ if ((use_gui) && (key == wsEnter))
+ break;
+#endif
+ vo_x11_putkey(key);
+ ret |= VO_EVENT_KEYPRESS;
+ }
+ break;
+ case MotionNotify:
+ if (vo_mouse_autohide)
+ {
+ vo_showcursor(mydisplay, vo_window);
+ vo_mouse_counter = vo_mouse_timer_const;
+ }
+ break;
+ case ButtonPress:
+ if (vo_mouse_autohide)
+ {
+ vo_showcursor(mydisplay, vo_window);
+ vo_mouse_counter = vo_mouse_timer_const;
+ }
+ // Ignore mouse whell press event
+ if (Event.xbutton.button > 3)
+ {
+ mplayer_put_key(MOUSE_BTN0 + Event.xbutton.button - 1);
+ break;
+ }
+#ifdef HAVE_NEW_GUI
+ // Ignor mouse button 1 - 3 under gui
+ if (use_gui && (Event.xbutton.button >= 1)
+ && (Event.xbutton.button <= 3))
+ break;
+#endif
+ mplayer_put_key((MOUSE_BTN0 + Event.xbutton.button -
+ 1) | MP_KEY_DOWN);
+ break;
+ case ButtonRelease:
+ if (vo_mouse_autohide)
+ {
+ vo_showcursor(mydisplay, vo_window);
+ vo_mouse_counter = vo_mouse_timer_const;
+ }
+#ifdef HAVE_NEW_GUI
+ // Ignor mouse button 1 - 3 under gui
+ if (use_gui && (Event.xbutton.button >= 1)
+ && (Event.xbutton.button <= 3))
+ break;
+#endif
+ mplayer_put_key(MOUSE_BTN0 + Event.xbutton.button - 1);
+ break;
+ case PropertyNotify:
+ {
+ char *name =
+ XGetAtomName(mydisplay, Event.xproperty.atom);
+
+ if (!name)
+ break;
+
// fprintf(stderr,"[ws] PropertyNotify ( 0x%x ) %s ( 0x%x )\n",vo_window,name,Event.xproperty.atom );
-
- XFree( name );
- }
- break;
- case MapNotify:
- vo_hint.win_gravity = old_gravity;
- XSetWMNormalHints( mDisplay,vo_window,&vo_hint );
- vo_fs_flip = 0;
- break;
- }
- }
- return ret;
-}
-
-void vo_x11_sizehint( int x, int y, int width, int height, int max )
-{
- vo_hint.flags=PPosition | PSize | PWinGravity;
- if(vo_keepaspect)
- {
- vo_hint.flags |= PAspect;
- vo_hint.min_aspect.x = width;
- vo_hint.min_aspect.y = height;
- vo_hint.max_aspect.x = width;
- vo_hint.max_aspect.y = height;
- }
-
- vo_hint.x=x; vo_hint.y=y; vo_hint.width=width; vo_hint.height=height;
- if ( max )
- {
- vo_hint.max_width=width; vo_hint.max_height=height;
- vo_hint.flags|=PMaxSize;
- } else { vo_hint.max_width=0; vo_hint.max_height=0; }
-
- // set min height/width to 4 to avoid off by one errors
- // and because mga_vid requires a minial size of 4 pixel
- vo_hint.min_width = vo_hint.min_height = 4;
- vo_hint.flags |= PMinSize;
- vo_hint.win_gravity=StaticGravity;
- XSetWMNormalHints( mDisplay,vo_window,&vo_hint );
+ XFree(name);
+ }
+ break;
+ case MapNotify:
+ vo_hint.win_gravity = old_gravity;
+ XSetWMNormalHints(mDisplay, vo_window, &vo_hint);
+ vo_fs_flip = 0;
+ break;
+ }
+ }
+ return ret;
+}
+
+void vo_x11_sizehint(int x, int y, int width, int height, int max)
+{
+ vo_hint.flags = PPosition | PSize | PWinGravity;
+ if (vo_keepaspect)
+ {
+ vo_hint.flags |= PAspect;
+ vo_hint.min_aspect.x = width;
+ vo_hint.min_aspect.y = height;
+ vo_hint.max_aspect.x = width;
+ vo_hint.max_aspect.y = height;
+ }
+
+ vo_hint.x = x;
+ vo_hint.y = y;
+ vo_hint.width = width;
+ vo_hint.height = height;
+ if (max)
+ {
+ vo_hint.max_width = width;
+ vo_hint.max_height = height;
+ vo_hint.flags |= PMaxSize;
+ } else
+ {
+ vo_hint.max_width = 0;
+ vo_hint.max_height = 0;
+ }
+
+ // set min height/width to 4 to avoid off by one errors
+ // and because mga_vid requires a minial size of 4 pixel
+ vo_hint.min_width = vo_hint.min_height = 4;
+ vo_hint.flags |= PMinSize;
+
+ vo_hint.win_gravity = StaticGravity;
+ XSetWMNormalHints(mDisplay, vo_window, &vo_hint);
}
static int vo_x11_get_gnome_layer(Display * mDisplay, Window win)
{
- Atom type;
- int format;
- unsigned long nitems;
- unsigned long bytesafter;
- unsigned short *args = NULL;
-
- if (XGetWindowProperty (mDisplay, win, XA_WIN_LAYER, 0, 16384,
- False, AnyPropertyType, &type, &format, &nitems,
- &bytesafter, (unsigned char **) &args) == Success
- && nitems > 0 && args)
- {
- mp_msg (MSGT_VO, MSGL_V, "[x11] original window layer is %d.\n", *args);
- return *args;
- }
- return WIN_LAYER_NORMAL;
+ Atom type;
+ int format;
+ unsigned long nitems;
+ unsigned long bytesafter;
+ unsigned short *args = NULL;
+
+ if (XGetWindowProperty(mDisplay, win, XA_WIN_LAYER, 0, 16384,
+ False, AnyPropertyType, &type, &format, &nitems,
+ &bytesafter,
+ (unsigned char **) &args) == Success
+ && nitems > 0 && args)
+ {
+ mp_msg(MSGT_VO, MSGL_V, "[x11] original window layer is %d.\n",
+ *args);
+ return *args;
+ }
+ return WIN_LAYER_NORMAL;
}
//
-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)
+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)
+{
+ unsigned long xswamask = CWBackingStore | CWBorderPixel;
+ XSetWindowAttributes xswa;
+ Window ret_win;
+
+ if (col_map != CopyFromParent)
+ {
+ xswa.colormap = col_map;
+ xswamask |= CWColormap;
+ }
+ xswa.background_pixel = 0;
+ xswa.border_pixel = 0;
+ xswa.backing_store = Always;
+ xswa.bit_gravity = StaticGravity;
+
+ ret_win =
+ XCreateWindow(mDisplay, mRootWin, x, y, width, height, 0, depth,
+ CopyFromParent, vis, xswamask, &xswa);
+ if (!f_gc)
+ f_gc = XCreateGC(mDisplay, ret_win, 0, 0);
+ XSetForeground(mDisplay, f_gc, 0);
+
+ return ret_win;
+}
+
+
+void vo_x11_clearwindow_part(Display * mDisplay, Window vo_window,
+ int img_width, int img_height, int use_fs)
+{
+ int u_dheight, u_dwidth, left_ov, left_ov2;
+
+ if (!f_gc)
+ return;
+
+ u_dheight = use_fs ? vo_screenheight : vo_dheight;
+ u_dwidth = use_fs ? vo_screenwidth : vo_dwidth;
+ if ((u_dheight <= img_height) && (u_dwidth <= img_width))
+ return;
+
+ left_ov = (u_dheight - img_height) / 2;
+ left_ov2 = (u_dwidth - img_width) / 2;
+
+ XFillRectangle(mDisplay, vo_window, f_gc, 0, 0, u_dwidth, left_ov);
+ XFillRectangle(mDisplay, vo_window, f_gc, 0, u_dheight - left_ov - 1,
+ u_dwidth, left_ov + 1);
+
+ if (u_dwidth > img_width)
+ {
+ XFillRectangle(mDisplay, vo_window, f_gc, 0, left_ov, left_ov2,
+ img_height);
+ XFillRectangle(mDisplay, vo_window, f_gc, u_dwidth - left_ov2 - 1,
+ left_ov, left_ov2, img_height);
+ }
+
+ XFlush(mDisplay);
+}
+
+void vo_x11_clearwindow(Display * mDisplay, Window vo_window)
{
- unsigned long xswamask = CWBackingStore | CWBorderPixel;
- XSetWindowAttributes xswa;
- Window ret_win;
-
- if (col_map!=CopyFromParent)
- {
- xswa.colormap = col_map;
- xswamask|=CWColormap;
- }
- xswa.background_pixel = 0;
- xswa.border_pixel = 0;
- xswa.backing_store = Always;
- xswa.bit_gravity = StaticGravity;
-
- ret_win = XCreateWindow(mDisplay, mRootWin, x, y, width, height, 0, depth,
- CopyFromParent, vis, xswamask , &xswa);
- if (!f_gc) f_gc=XCreateGC (mDisplay, ret_win, 0, 0);
- XSetForeground (mDisplay, f_gc, 0);
-
- return ret_win;
-}
-
-
-void vo_x11_clearwindow_part(Display *mDisplay, Window vo_window, int img_width, int img_height, int use_fs)
-{
- int u_dheight, u_dwidth, left_ov, left_ov2;
-
- if (!f_gc) return;
-
- u_dheight = use_fs?vo_screenheight:vo_dheight;
- u_dwidth = use_fs?vo_screenwidth:vo_dwidth;
- if ((u_dheight<=img_height) && (u_dwidth<=img_width)) return;
-
- left_ov = (u_dheight - img_height)/2;
- left_ov2 = (u_dwidth - img_width)/2;
-
- XFillRectangle(mDisplay, vo_window, f_gc, 0, 0, u_dwidth, left_ov);
- XFillRectangle(mDisplay, vo_window, f_gc, 0, u_dheight-left_ov-1, u_dwidth, left_ov+1);
-
- if (u_dwidth>img_width)
- {
- XFillRectangle(mDisplay, vo_window, f_gc, 0, left_ov, left_ov2, img_height);
- XFillRectangle(mDisplay, vo_window, f_gc, u_dwidth-left_ov2-1, left_ov, left_ov2, img_height);
- }
-
- XFlush(mDisplay);
-}
-
-void vo_x11_clearwindow( Display *mDisplay, Window vo_window )
-{
- if (!f_gc) return;
- XFillRectangle(mDisplay, vo_window, f_gc, 0, 0, vo_screenwidth, vo_screenheight);
- //
- XFlush(mDisplay);
-}
-
-
-void vo_x11_setlayer( Display * mDisplay,Window vo_window,int layer )
-{
- if (WinID >= 0) return;
-
- if ( vo_fs_type & vo_wm_LAYER )
- {
- XClientMessageEvent xev;
-
- if (!orig_layer) orig_layer=vo_x11_get_gnome_layer( mDisplay, vo_window );
-
- memset(&xev, 0, sizeof(xev));
- xev.type = ClientMessage;
- xev.display= mDisplay;
- xev.window = vo_window;
- xev.message_type = XA_WIN_LAYER;
- xev.format = 32;
- xev.data.l[0] = layer?fs_layer:orig_layer; // if not fullscreen, stay on default layer
- xev.data.l[1] = CurrentTime;
- mp_msg( MSGT_VO,MSGL_V,"[x11] Layered style stay on top (layer %d).\n",xev.data.l[0] );
- XSendEvent(mDisplay, mRootWin, False, SubstructureNotifyMask, (XEvent *) &xev);
- } else
- if ( vo_fs_type & vo_wm_NETWM )
- {
- XClientMessageEvent xev;
- char *state;
-
- memset( &xev,0,sizeof( xev ) );
- xev.type=ClientMessage;
- xev.message_type=XA_NET_WM_STATE;
- xev.display=mDisplay;
- xev.window=vo_window;
- xev.format=32;
- xev.data.l[0]=layer;
-
- if ( vo_fs_type & vo_wm_STAYS_ON_TOP )
- xev.data.l[1]=XA_NET_WM_STATE_STAYS_ON_TOP;
- else
- if ( vo_fs_type & vo_wm_ABOVE )
- xev.data.l[1]=XA_NET_WM_STATE_ABOVE;
- else
- if ( vo_fs_type & vo_wm_FULLSCREEN )
- xev.data.l[1]=XA_NET_WM_STATE_FULLSCREEN;
- else
- if ( vo_fs_type & vo_wm_BELOW )
- // This is not fallback. We can safely assume that situation where
- // only NETWM_STATE_BELOW is supported and others not, doesn't exist.
- xev.data.l[1]=XA_NET_WM_STATE_BELOW;
-
- XSendEvent( mDisplay,mRootWin,False,SubstructureRedirectMask,(XEvent*)&xev );
- state = XGetAtomName (mDisplay, xev.data.l[1]);
- mp_msg( MSGT_VO,MSGL_V,"[x11] NET style stay on top (layer %d). Using state %s.\n",layer,state );
- XFree (state);
- }
+ if (!f_gc)
+ return;
+ XFillRectangle(mDisplay, vo_window, f_gc, 0, 0, vo_screenwidth,
+ vo_screenheight);
+ //
+ XFlush(mDisplay);
+}
+
+
+void vo_x11_setlayer(Display * mDisplay, Window vo_window, int layer)
+{
+ if (WinID >= 0)
+ return;
+
+ if (vo_fs_type & vo_wm_LAYER)
+ {
+ XClientMessageEvent xev;
+
+ if (!orig_layer)
+ orig_layer = vo_x11_get_gnome_layer(mDisplay, vo_window);
+
+ memset(&xev, 0, sizeof(xev));
+ xev.type = ClientMessage;
+ xev.display = mDisplay;
+ xev.window = vo_window;
+ xev.message_type = XA_WIN_LAYER;
+ xev.format = 32;
+ xev.data.l[0] = layer ? fs_layer : orig_layer; // if not fullscreen, stay on default layer
+ xev.data.l[1] = CurrentTime;
+ mp_msg(MSGT_VO, MSGL_V,
+ "[x11] Layered style stay on top (layer %d).\n",
+ xev.data.l[0]);
+ XSendEvent(mDisplay, mRootWin, False, SubstructureNotifyMask,
+ (XEvent *) & xev);
+ } else if (vo_fs_type & vo_wm_NETWM)
+ {
+ XClientMessageEvent xev;
+ char *state;
+
+ memset(&xev, 0, sizeof(xev));
+ xev.type = ClientMessage;
+ xev.message_type = XA_NET_WM_STATE;
+ xev.display = mDisplay;
+ xev.window = vo_window;
+ xev.format = 32;
+ xev.data.l[0] = layer;
+
+ if (vo_fs_type & vo_wm_STAYS_ON_TOP)
+ xev.data.l[1] = XA_NET_WM_STATE_STAYS_ON_TOP;
+ else if (vo_fs_type & vo_wm_ABOVE)
+ xev.data.l[1] = XA_NET_WM_STATE_ABOVE;
+ else if (vo_fs_type & vo_wm_FULLSCREEN)
+ xev.data.l[1] = XA_NET_WM_STATE_FULLSCREEN;
+ else if (vo_fs_type & vo_wm_BELOW)
+ // This is not fallback. We can safely assume that situation where
+ // only NETWM_STATE_BELOW is supported and others not, doesn't exist.
+ xev.data.l[1] = XA_NET_WM_STATE_BELOW;
+
+ XSendEvent(mDisplay, mRootWin, False, SubstructureRedirectMask,
+ (XEvent *) & xev);
+ state = XGetAtomName(mDisplay, xev.data.l[1]);
+ mp_msg(MSGT_VO, MSGL_V,
+ "[x11] NET style stay on top (layer %d). Using state %s.\n",
+ layer, state);
+ XFree(state);
+ }
}
static int vo_x11_get_fs_type(int supported)
{
- int i;
- int type = supported;
-
- if (vo_fstype_list) {
- i = 0;
- for (i = 0; vo_fstype_list[i]; i++)
- {
- int neg = 0;
- char * arg = vo_fstype_list[i];
-
- if (vo_fstype_list[i][0] == '-')
- {
- neg = 1;
- arg = vo_fstype_list[i] + 1;
- }
-
- if (!strncmp(arg, "layer", 5))
- {
- if (!neg && (arg[5] == '='))
+ int i;
+ int type = supported;
+
+ if (vo_fstype_list)
+ {
+ i = 0;
+ for (i = 0; vo_fstype_list[i]; i++)
{
- char *endptr = NULL;
- int layer = strtol(vo_fstype_list[i]+6, &endptr, 10);
-
- if (endptr && *endptr == '\0' && layer >= 0 && layer <= 15)
- fs_layer = layer;
+ int neg = 0;
+ char *arg = vo_fstype_list[i];
+
+ if (vo_fstype_list[i][0] == '-')
+ {
+ neg = 1;
+ arg = vo_fstype_list[i] + 1;
+ }
+
+ if (!strncmp(arg, "layer", 5))
+ {
+ if (!neg && (arg[5] == '='))
+ {
+ char *endptr = NULL;
+ int layer = strtol(vo_fstype_list[i] + 6, &endptr, 10);
+
+ if (endptr && *endptr == '\0' && layer >= 0
+ && layer <= 15)
+ fs_layer = layer;
+ }
+ if (neg)
+ type &= ~vo_wm_LAYER;
+ else
+ type |= vo_wm_LAYER;
+ } else if (!strcmp(arg, "above"))
+ {
+ if (neg)
+ type &= ~vo_wm_ABOVE;
+ else
+ type |= vo_wm_ABOVE;
+ } else if (!strcmp(arg, "fullscreen"))
+ {
+ if (neg)
+ type &= ~vo_wm_FULLSCREEN;
+ else
+ type |= vo_wm_FULLSCREEN;
+ } else if (!strcmp(arg, "stays_on_top"))
+ {
+ if (neg)
+ type &= ~vo_wm_STAYS_ON_TOP;
+ else
+ type |= vo_wm_STAYS_ON_TOP;
+ } else if (!strcmp(arg, "below"))
+ {
+ if (neg)
+ type &= ~vo_wm_BELOW;
+ else
+ type |= vo_wm_BELOW;
+ } else if (!strcmp(arg, "netwm"))
+ {
+ if (neg)
+ type &= ~vo_wm_NETWM;
+ else
+ type |= vo_wm_NETWM;
+ } else if (!strcmp(arg, "none"))
+ return 0;
}
- if (neg)
- type &= ~vo_wm_LAYER;
- else
- type |= vo_wm_LAYER;
- }
- else if (!strcmp(arg, "above"))
- {
- if (neg)
- type &= ~vo_wm_ABOVE;
- else
- type |= vo_wm_ABOVE;
- } else if (!strcmp(arg, "fullscreen"))
- {
- if (neg)
- type &= ~vo_wm_FULLSCREEN;
- else
- type |= vo_wm_FULLSCREEN;
- } else if (!strcmp(arg, "stays_on_top"))
- {
- if (neg)
- type &= ~vo_wm_STAYS_ON_TOP;
- else
- type |= vo_wm_STAYS_ON_TOP;
- } else if (!strcmp(arg, "below"))
- {
- if (neg)
- type &= ~vo_wm_BELOW;
- else
- type |= vo_wm_BELOW;
- } else if (!strcmp(arg, "netwm"))
- {
- if (neg)
- type &= ~vo_wm_NETWM;
- else
- type |= vo_wm_NETWM;
- } else if (!strcmp(arg, "none")) return 0;
- }
- }
-
- return type;
-}
-
-void vo_x11_fullscreen( void )
-{
- int x,y,w,h;
-
- if ( WinID >= 0 || vo_fs_flip) return;
-
- if ( vo_fs ){
- // fs->win
- vo_x11_ewmh_fullscreen( _NET_WM_STATE_REMOVE ); // removes fullscreen state if wm supports EWMH
-
- if(vo_dwidth != vo_screenwidth && vo_dheight != vo_screenheight) return;
- vo_fs=VO_FALSE;
- x=vo_old_x; y=vo_old_y; w=vo_old_width; h=vo_old_height;
- } else {
- // win->fs
- vo_x11_ewmh_fullscreen( _NET_WM_STATE_ADD ); // sends fullscreen state to be added if wm supports EWMH
-
- if(vo_old_width &&
- (vo_dwidth==vo_screenwidth && vo_dwidth!=vo_old_width) &&
- (vo_dheight==vo_screenheight && vo_dheight!=vo_old_height) ) return;
- vo_fs=VO_TRUE;
- vo_old_x=vo_dx; vo_old_y=vo_dy; vo_old_width=vo_dwidth; vo_old_height=vo_dheight;
- x=0; y=0; w=vo_screenwidth; h=vo_screenheight;
-
- }
- {
- long dummy;
- XGetWMNormalHints(mDisplay, vo_window, &vo_hint, &dummy);
- if (!(vo_hint.flags & PWinGravity))
- old_gravity = NorthWestGravity;
- else
- old_gravity = vo_hint.win_gravity;
- }
- if(vo_wm_type==0 && !(vo_fsmode&16)) {
- XUnmapWindow( mDisplay,vo_window ); // required for MWM
- XWithdrawWindow(mDisplay,vo_window,mScreen);
- vo_fs_flip = 1;
- }
-
- vo_x11_decoration( mDisplay,vo_window,(vo_fs) ? 0 : 1 );
- vo_x11_sizehint( x,y,w,h,0 );
- vo_x11_setlayer( mDisplay,vo_window,vo_fs );
+ }
+
+ return type;
+}
+
+void vo_x11_fullscreen(void)
+{
+ int x, y, w, h;
+
+ if (WinID >= 0 || vo_fs_flip)
+ return;
+
+ if (vo_fs)
+ {
+ // fs->win
+ vo_x11_ewmh_fullscreen(_NET_WM_STATE_REMOVE); // removes fullscreen state if wm supports EWMH
+
+ if (vo_dwidth != vo_screenwidth && vo_dheight != vo_screenheight)
+ return;
+ vo_fs = VO_FALSE;
+ x = vo_old_x;
+ y = vo_old_y;
+ w = vo_old_width;
+ h = vo_old_height;
+ } else
+ {
+ // win->fs
+ vo_x11_ewmh_fullscreen(_NET_WM_STATE_ADD); // sends fullscreen state to be added if wm supports EWMH
+
+ if (vo_old_width &&
+ (vo_dwidth == vo_screenwidth && vo_dwidth != vo_old_width) &&
+ (vo_dheight == vo_screenheight && vo_dheight != vo_old_height))
+ return;
+ vo_fs = VO_TRUE;
+ vo_old_x = vo_dx;
+ vo_old_y = vo_dy;
+ vo_old_width = vo_dwidth;
+ vo_old_height = vo_dheight;
+ x = 0;
+ y = 0;
+ w = vo_screenwidth;
+ h = vo_screenheight;
+
+ }
+ {
+ long dummy;
+
+ XGetWMNormalHints(mDisplay, vo_window, &vo_hint, &dummy);
+ if (!(vo_hint.flags & PWinGravity))
+ old_gravity = NorthWestGravity;
+ else
+ old_gravity = vo_hint.win_gravity;
+ }
+ if (vo_wm_type == 0 && !(vo_fsmode & 16))
+ {
+ XUnmapWindow(mDisplay, vo_window); // required for MWM
+ XWithdrawWindow(mDisplay, vo_window, mScreen);
+ vo_fs_flip = 1;
+ }
- if ((!(vo_fs)) & vo_ontop) vo_x11_setlayer(mDisplay, vo_window,vo_ontop);
+ vo_x11_decoration(mDisplay, vo_window, (vo_fs) ? 0 : 1);
+ vo_x11_sizehint(x, y, w, h, 0);
+ vo_x11_setlayer(mDisplay, vo_window, vo_fs);
- XMoveResizeWindow( mDisplay,vo_window,x,y,w,h );
+ if ((!(vo_fs)) & vo_ontop)
+ vo_x11_setlayer(mDisplay, vo_window, vo_ontop);
+
+ XMoveResizeWindow(mDisplay, vo_window, x, y, w, h);
#ifdef HAVE_XINERAMA
- vo_x11_xinerama_move(mDisplay,vo_window);
+ vo_x11_xinerama_move(mDisplay, vo_window);
#endif
- XMapRaised( mDisplay,vo_window );
- XRaiseWindow( mDisplay,vo_window );
- XFlush( mDisplay );
+ XMapRaised(mDisplay, vo_window);
+ XRaiseWindow(mDisplay, vo_window);
+ XFlush(mDisplay);
}
-void vo_x11_ontop( void )
+void vo_x11_ontop(void)
{
- vo_ontop = (!(vo_ontop));
+ vo_ontop = (!(vo_ontop));
- vo_x11_setlayer(mDisplay, vo_window, vo_ontop);
+ vo_x11_setlayer(mDisplay, vo_window, vo_ontop);
}
/*
@@ -1163,16 +1478,16 @@
static int got_badwindow;
static XErrorHandler old_handler;
-static int badwindow_handler(Display *dpy, XErrorEvent *error)
+static int badwindow_handler(Display * dpy, XErrorEvent * error)
{
if (error->error_code != BadWindow)
- return (*old_handler)(dpy, error);
+ return (*old_handler) (dpy, error);
got_badwindow = True;
return 0;
}
-static Window find_xscreensaver_window(Display *dpy)
+static Window find_xscreensaver_window(Display * dpy)
{
int i;
Window root = RootWindowOfScreen(DefaultScreenOfDisplay(dpy));
@@ -1185,28 +1500,33 @@
if (!(xs_version != None &&
XQueryTree(dpy, root, &root2, &parent, &kids, &nkids) &&
- kids && nkids)) return 0;
+ kids && nkids))
+ return 0;
old_handler = XSetErrorHandler(badwindow_handler);
- for (i = 0; i < nkids; i++) {
- Atom type;
- int format;
- unsigned long nitems, bytesafter;
- char *v;
- int status;
+ for (i = 0; i < nkids; i++)
+ {
+ Atom type;
+ int format;
+ unsigned long nitems, bytesafter;
+ char *v;
+ int status;
got_badwindow = False;
- status = XGetWindowProperty(dpy, kids[i], xs_version, 0, 200, False,
- XA_STRING, &type, &format, &nitems,
- &bytesafter, (unsigned char**) &v);
- XSync(dpy, False);
- if (got_badwindow) status = BadWindow;
-
- if (status == Success && type != None) {
- retval = kids[i];
- break;
- }
+ status =
+ XGetWindowProperty(dpy, kids[i], xs_version, 0, 200, False,
+ XA_STRING, &type, &format, &nitems,
+ &bytesafter, (unsigned char **) &v);
+ XSync(dpy, False);
+ if (got_badwindow)
+ status = BadWindow;
+
+ if (status == Success && type != None)
+ {
+ retval = kids[i];
+ break;
+ }
}
XFree(kids);
XSetErrorHandler(old_handler);
@@ -1226,35 +1546,36 @@
XEvent ev;
if (mDisplay && xs_windowid &&
- ((time - time_last)>30000 ||
- (time - time_last)<0)) {
- time_last = time;
-
- ev.xany.type = ClientMessage;
- ev.xclient.display = mDisplay;
- ev.xclient.window = xs_windowid;
- ev.xclient.message_type = screensaver;
- ev.xclient.format = 32;
- memset(&ev.xclient.data, 0, sizeof(ev.xclient.data));
- ev.xclient.data.l[0] = (long) deactivate;
+ ((time - time_last) > 30000 || (time - time_last) < 0))
+ {
+ time_last = time;
- mp_msg(MSGT_VO,MSGL_DBG2, "Pinging xscreensaver.\n");
- XSendEvent(mDisplay, xs_windowid, False, 0L, &ev);
- XSync(mDisplay, False);
+ ev.xany.type = ClientMessage;
+ ev.xclient.display = mDisplay;
+ ev.xclient.window = xs_windowid;
+ ev.xclient.message_type = screensaver;
+ ev.xclient.format = 32;
+ memset(&ev.xclient.data, 0, sizeof(ev.xclient.data));
+ ev.xclient.data.l[0] = (long) deactivate;
+
+ mp_msg(MSGT_VO, MSGL_DBG2, "Pinging xscreensaver.\n");
+ XSendEvent(mDisplay, xs_windowid, False, 0L, &ev);
+ XSync(mDisplay, False);
}
}
-static void xscreensaver_disable(Display *dpy)
+static void xscreensaver_disable(Display * dpy)
{
- mp_msg(MSGT_VO,MSGL_DBG2, "xscreensaver_disable()\n");
+ mp_msg(MSGT_VO, MSGL_DBG2, "xscreensaver_disable()\n");
xs_windowid = find_xscreensaver_window(dpy);
- if (!xs_windowid) {
- mp_msg(MSGT_VO,MSGL_INFO,
- "xscreensaver_disable: Could not find xscreensaver window.\n");
- return;
+ if (!xs_windowid)
+ {
+ mp_msg(MSGT_VO, MSGL_INFO,
+ "xscreensaver_disable: Could not find xscreensaver window.\n");
+ return;
}
- mp_msg(MSGT_VO,MSGL_INFO,
+ mp_msg(MSGT_VO, MSGL_INFO,
"xscreensaver_disable: xscreensaver wid=%d.\n", xs_windowid);
deactivate = XInternAtom(dpy, "DEACTIVATE", False);
@@ -1270,203 +1591,264 @@
* End of XScreensaver stuff
*/
-void saver_on(Display *mDisplay) {
+void saver_on(Display * mDisplay)
+{
#ifdef HAVE_XDPMS
int nothing;
+
if (dpms_disabled)
{
- if (DPMSQueryExtension(mDisplay, ¬hing, ¬hing))
- {
- if (!DPMSEnable(mDisplay)) { // restoring power saving settings
- mp_msg(MSGT_VO,MSGL_WARN,"DPMS not available?\n");
- } else {
+ if (DPMSQueryExtension(mDisplay, ¬hing, ¬hing))
+ {
+ if (!DPMSEnable(mDisplay))
+ { // restoring power saving settings
+ mp_msg(MSGT_VO, MSGL_WARN, "DPMS not available?\n");
+ } else
+ {
// DPMS does not seem to be enabled unless we call DPMSInfo
- BOOL onoff;
- CARD16 state;
- DPMSForceLevel(mDisplay, DPMSModeOn);
- DPMSInfo(mDisplay, &state, &onoff);
- if (onoff) {
- mp_msg(MSGT_VO,MSGL_INFO,"Successfully enabled DPMS\n");
- } else {
- mp_msg(MSGT_VO,MSGL_WARN,"Could not enable DPMS\n");
+ BOOL onoff;
+ CARD16 state;
+
+ DPMSForceLevel(mDisplay, DPMSModeOn);
+ DPMSInfo(mDisplay, &state, &onoff);
+ if (onoff)
+ {
+ mp_msg(MSGT_VO, MSGL_INFO,
+ "Successfully enabled DPMS\n");
+ } else
+ {
+ mp_msg(MSGT_VO, MSGL_WARN, "Could not enable DPMS\n");
}
}
- }
- dpms_disabled=0;
+ }
+ dpms_disabled = 0;
}
#endif
if (timeout_save)
{
- int dummy, interval, prefer_blank, allow_exp;
- XGetScreenSaver(mDisplay, &dummy, &interval, &prefer_blank, &allow_exp);
- XSetScreenSaver(mDisplay, timeout_save, interval, prefer_blank, allow_exp);
- XGetScreenSaver(mDisplay, &timeout_save, &interval, &prefer_blank, &allow_exp);
- timeout_save=0;
+ int dummy, interval, prefer_blank, allow_exp;
+
+ XGetScreenSaver(mDisplay, &dummy, &interval, &prefer_blank,
+ &allow_exp);
+ XSetScreenSaver(mDisplay, timeout_save, interval, prefer_blank,
+ allow_exp);
+ XGetScreenSaver(mDisplay, &timeout_save, &interval, &prefer_blank,
+ &allow_exp);
+ timeout_save = 0;
}
- if (stop_xscreensaver) xscreensaver_enable();
- if (kdescreensaver_was_running && stop_xscreensaver) {
- system("dcop kdesktop KScreensaverIface enable true 2>/dev/null >/dev/null");
- kdescreensaver_was_running = 0;
+ if (stop_xscreensaver)
+ xscreensaver_enable();
+ if (kdescreensaver_was_running && stop_xscreensaver)
+ {
+ system
+ ("dcop kdesktop KScreensaverIface enable true 2>/dev/null >/dev/null");
+ kdescreensaver_was_running = 0;
}
}
-void saver_off(Display *mDisplay) {
+void saver_off(Display * mDisplay)
+{
int interval, prefer_blank, allow_exp;
+
#ifdef HAVE_XDPMS
int nothing;
if (DPMSQueryExtension(mDisplay, ¬hing, ¬hing))
{
- BOOL onoff;
- CARD16 state;
- DPMSInfo(mDisplay, &state, &onoff);
- if (onoff)
- {
- Status stat;
- mp_msg(MSGT_VO,MSGL_INFO,"Disabling DPMS\n");
- dpms_disabled=1;
- stat = DPMSDisable(mDisplay); // monitor powersave off
- mp_msg(MSGT_VO,MSGL_V,"DPMSDisable stat: %d\n", stat);
- }
- }
-#endif
- if (!timeout_save) {
- XGetScreenSaver(mDisplay, &timeout_save, &interval, &prefer_blank, &allow_exp);
- if (timeout_save)
- XSetScreenSaver(mDisplay, 0, interval, prefer_blank, allow_exp);
+ BOOL onoff;
+ CARD16 state;
+
+ DPMSInfo(mDisplay, &state, &onoff);
+ if (onoff)
+ {
+ Status stat;
+
+ mp_msg(MSGT_VO, MSGL_INFO, "Disabling DPMS\n");
+ dpms_disabled = 1;
+ stat = DPMSDisable(mDisplay); // monitor powersave off
+ mp_msg(MSGT_VO, MSGL_V, "DPMSDisable stat: %d\n", stat);
+ }
}
- // turning off screensaver
- if (stop_xscreensaver) xscreensaver_disable(mDisplay);
+#endif
+ if (!timeout_save)
+ {
+ XGetScreenSaver(mDisplay, &timeout_save, &interval, &prefer_blank,
+ &allow_exp);
+ if (timeout_save)
+ XSetScreenSaver(mDisplay, 0, interval, prefer_blank,
+ allow_exp);
+ }
+ // turning off screensaver
+ if (stop_xscreensaver)
+ xscreensaver_disable(mDisplay);
if (stop_xscreensaver && !kdescreensaver_was_running)
{
- kdescreensaver_was_running=(system("dcop kdesktop KScreensaverIface isEnabled 2>/dev/null | sed 's/1/true/g' | grep true 2>/dev/null >/dev/null")==0);
- if (kdescreensaver_was_running)
- system("dcop kdesktop KScreensaverIface enable false 2>/dev/null >/dev/null");
+ kdescreensaver_was_running =
+ (system
+ ("dcop kdesktop KScreensaverIface isEnabled 2>/dev/null | sed 's/1/true/g' | grep true 2>/dev/null >/dev/null")
+ == 0);
+ if (kdescreensaver_was_running)
+ system
+ ("dcop kdesktop KScreensaverIface enable false 2>/dev/null >/dev/null");
}
}
static XErrorHandler old_handler = NULL;
static int selectinput_err = 0;
-static int x11_selectinput_errorhandler(Display *display, XErrorEvent *event)
+static int x11_selectinput_errorhandler(Display * display,
+ XErrorEvent * event)
+{
+ if (event->error_code == BadAccess)
+ {
+ selectinput_err = 1;
+ mp_msg(MSGT_VO, MSGL_ERR,
+ "X11 error: BadAccess during XSelectInput Call\n");
+ mp_msg(MSGT_VO, MSGL_ERR,
+ "X11 error: The 'ButtonPressMask' mask of specified window has probably already used by another appication (see man XSelectInput)\n");
+ /* If you think mplayer should shutdown with this error, comments out following line */
+ return 0;
+ }
+ if (old_handler != NULL)
+ old_handler(display, event);
+ else
+ x11_errorhandler(display, event);
+ return 0;
+}
+
+void vo_x11_selectinput_witherr(Display * display, Window w,
+ long event_mask)
{
- if (event->error_code == BadAccess) {
- selectinput_err = 1;
- mp_msg(MSGT_VO, MSGL_ERR, "X11 error: BadAccess during XSelectInput Call\n");
- mp_msg(MSGT_VO, MSGL_ERR, "X11 error: The 'ButtonPressMask' mask of specified window has probably already used by another appication (see man XSelectInput)\n");
- /* If you think mplayer should shutdown with this error, comments out following line */
- return 0;
- }
- if (old_handler != NULL) old_handler(display, event);
- else x11_errorhandler(display, event);
- return 0;
-}
-
-void vo_x11_selectinput_witherr(Display *display, Window w, long event_mask)
-{
- XSync(display, False);
- old_handler = XSetErrorHandler(x11_selectinput_errorhandler);
- selectinput_err = 0;
- if(vo_nomouse_input){
- XSelectInput(display,w,event_mask & (~(ButtonPressMask | ButtonReleaseMask)));
- } else {
- XSelectInput(display, w, event_mask);
- }
- XSync(display, False);
- XSetErrorHandler(old_handler);
- if (selectinput_err) {
- mp_msg(MSGT_VO, MSGL_ERR, "X11 error: MPlayer discards mouse control (reconfiguring)\n");
- XSelectInput(display, w, event_mask & (~(ButtonPressMask | ButtonReleaseMask | PointerMotionMask)) );
- }
+ XSync(display, False);
+ old_handler = XSetErrorHandler(x11_selectinput_errorhandler);
+ selectinput_err = 0;
+ if (vo_nomouse_input)
+ {
+ XSelectInput(display, w,
+ event_mask &
+ (~(ButtonPressMask | ButtonReleaseMask)));
+ } else
+ {
+ XSelectInput(display, w, event_mask);
+ }
+ XSync(display, False);
+ XSetErrorHandler(old_handler);
+ if (selectinput_err)
+ {
+ mp_msg(MSGT_VO, MSGL_ERR,
+ "X11 error: MPlayer discards mouse control (reconfiguring)\n");
+ XSelectInput(display, w,
+ event_mask &
+ (~
+ (ButtonPressMask | ButtonReleaseMask |
+ PointerMotionMask)));
+ }
}
#ifdef HAVE_XINERAMA
-void vo_x11_xinerama_move(Display *dsp, Window w)
+void vo_x11_xinerama_move(Display * dsp, Window w)
{
- if(XineramaIsActive(dsp) && ! geometry_xy_changed)
- {
- /* printf("XXXX Xinerama screen: x: %hd y: %hd\n",xinerama_x,xinerama_y); */
- XMoveWindow(dsp,w,xinerama_x,xinerama_y);
- }
+ if (XineramaIsActive(dsp) && !geometry_xy_changed)
+ {
+ /* printf("XXXX Xinerama screen: x: %hd y: %hd\n",xinerama_x,xinerama_y); */
+ XMoveWindow(dsp, w, xinerama_x, xinerama_y);
+ }
}
#endif
#ifdef HAVE_XF86VM
-void vo_vm_switch(uint32_t X, uint32_t Y, int* modeline_width, int* modeline_height)
+void vo_vm_switch(uint32_t X, uint32_t Y, int *modeline_width,
+ int *modeline_height)
{
unsigned int vm_event, vm_error;
unsigned int vm_ver, vm_rev;
- int i,j,have_vm=0;
+ int i, j, have_vm = 0;
int modecount;
-
- if (XF86VidModeQueryExtension(mDisplay, &vm_event, &vm_error)) {
- XF86VidModeQueryVersion(mDisplay, &vm_ver, &vm_rev);
- mp_msg(MSGT_VO,MSGL_V,"XF86VidMode Extension v%i.%i\n", vm_ver, vm_rev);
- have_vm=1;
+
+ if (XF86VidModeQueryExtension(mDisplay, &vm_event, &vm_error))
+ {
+ XF86VidModeQueryVersion(mDisplay, &vm_ver, &vm_rev);
+ mp_msg(MSGT_VO, MSGL_V, "XF86VidMode Extension v%i.%i\n", vm_ver,
+ vm_rev);
+ have_vm = 1;
} else
- mp_msg(MSGT_VO,MSGL_WARN,"XF86VidMode Extenstion not available.\n");
+ mp_msg(MSGT_VO, MSGL_WARN,
+ "XF86VidMode Extenstion not available.\n");
- if (have_vm) {
- if (vidmodes==NULL)
- XF86VidModeGetAllModeLines(mDisplay,mScreen,&modecount,&vidmodes);
- j=0;
- *modeline_width=vidmodes[0]->hdisplay;
- *modeline_height=vidmodes[0]->vdisplay;
-
- for (i=1; i<modecount; i++)
- if ((vidmodes[i]->hdisplay >= X) && (vidmodes[i]->vdisplay >= Y))
- if ( (vidmodes[i]->hdisplay <= *modeline_width ) && (vidmodes[i]->vdisplay <= *modeline_height) )
- {
- *modeline_width=vidmodes[i]->hdisplay;
- *modeline_height=vidmodes[i]->vdisplay;
- j=i;
- }
-
- mp_msg(MSGT_VO,MSGL_INFO,"XF86VM: Selected video mode %dx%d for image size %dx%d.\n",*modeline_width, *modeline_height, X, Y);
- XF86VidModeLockModeSwitch(mDisplay,mScreen,0);
- XF86VidModeSwitchToMode(mDisplay,mScreen,vidmodes[j]);
- XF86VidModeSwitchToMode(mDisplay,mScreen,vidmodes[j]);
- X=(vo_screenwidth-*modeline_width)/2;
- Y=(vo_screenheight-*modeline_height)/2;
- XF86VidModeSetViewPort(mDisplay,mScreen,X,Y);
+ if (have_vm)
+ {
+ if (vidmodes == NULL)
+ XF86VidModeGetAllModeLines(mDisplay, mScreen, &modecount,
+ &vidmodes);
+ j = 0;
+ *modeline_width = vidmodes[0]->hdisplay;
+ *modeline_height = vidmodes[0]->vdisplay;
+
+ for (i = 1; i < modecount; i++)
+ if ((vidmodes[i]->hdisplay >= X)
+ && (vidmodes[i]->vdisplay >= Y))
+ if ((vidmodes[i]->hdisplay <= *modeline_width)
+ && (vidmodes[i]->vdisplay <= *modeline_height))
+ {
+ *modeline_width = vidmodes[i]->hdisplay;
+ *modeline_height = vidmodes[i]->vdisplay;
+ j = i;
+ }
+
+ mp_msg(MSGT_VO, MSGL_INFO,
+ "XF86VM: Selected video mode %dx%d for image size %dx%d.\n",
+ *modeline_width, *modeline_height, X, Y);
+ XF86VidModeLockModeSwitch(mDisplay, mScreen, 0);
+ XF86VidModeSwitchToMode(mDisplay, mScreen, vidmodes[j]);
+ XF86VidModeSwitchToMode(mDisplay, mScreen, vidmodes[j]);
+ X = (vo_screenwidth - *modeline_width) / 2;
+ Y = (vo_screenheight - *modeline_height) / 2;
+ XF86VidModeSetViewPort(mDisplay, mScreen, X, Y);
}
}
-void vo_vm_close(Display *dpy)
-{
- #ifdef HAVE_NEW_GUI
- if (vidmodes!=NULL && vo_window != None)
- #else
- if (vidmodes!=NULL)
- #endif
- {
- int i, modecount;
- int screen; screen=DefaultScreen( dpy );
-
- free(vidmodes); vidmodes=NULL;
- XF86VidModeGetAllModeLines(mDisplay,mScreen,&modecount,&vidmodes);
- for (i=0; i<modecount; i++)
- if ((vidmodes[i]->hdisplay == vo_screenwidth) && (vidmodes[i]->vdisplay == vo_screenheight))
- {
- mp_msg(MSGT_VO,MSGL_INFO,"Returning to original mode %dx%d\n", vo_screenwidth, vo_screenheight);
- break;
- }
-
- XF86VidModeSwitchToMode(dpy,screen,vidmodes[i]);
- XF86VidModeSwitchToMode(dpy,screen,vidmodes[i]);
- free(vidmodes);
- vidmodes = NULL;
- }
+void vo_vm_close(Display * dpy)
+{
+#ifdef HAVE_NEW_GUI
+ if (vidmodes != NULL && vo_window != None)
+#else
+ if (vidmodes != NULL)
+#endif
+ {
+ int i, modecount;
+ int screen;
+
+ screen = DefaultScreen(dpy);
+
+ free(vidmodes);
+ vidmodes = NULL;
+ XF86VidModeGetAllModeLines(mDisplay, mScreen, &modecount,
+ &vidmodes);
+ for (i = 0; i < modecount; i++)
+ if ((vidmodes[i]->hdisplay == vo_screenwidth)
+ && (vidmodes[i]->vdisplay == vo_screenheight))
+ {
+ mp_msg(MSGT_VO, MSGL_INFO,
+ "Returning to original mode %dx%d\n",
+ vo_screenwidth, vo_screenheight);
+ break;
+ }
+
+ XF86VidModeSwitchToMode(dpy, screen, vidmodes[i]);
+ XF86VidModeSwitchToMode(dpy, screen, vidmodes[i]);
+ free(vidmodes);
+ vidmodes = NULL;
+ }
}
#endif
-#endif /* X11_FULLSCREEN */
+#endif /* X11_FULLSCREEN */
/*
@@ -1475,45 +1857,50 @@
* depth (at least 15bit). If there are multiple visuals with depth
* >= 15bit, we prefer visuals with a smaller color depth.
*/
-int vo_find_depth_from_visuals(Display *dpy, int screen, Visual **visual_return)
+int vo_find_depth_from_visuals(Display * dpy, int screen,
+ Visual ** visual_return)
{
- XVisualInfo visual_tmpl;
- XVisualInfo *visuals;
- int nvisuals, i;
- int bestvisual = -1;
- int bestvisual_depth = -1;
-
- visual_tmpl.screen = screen;
- visual_tmpl.class = TrueColor;
- visuals = XGetVisualInfo(dpy,
- VisualScreenMask | VisualClassMask, &visual_tmpl,
- &nvisuals);
- if (visuals != NULL) {
- for (i = 0; i < nvisuals; i++) {
- mp_msg(MSGT_VO,MSGL_V,"vo: X11 truecolor visual %#x, depth %d, R:%lX G:%lX B:%lX\n",
- visuals[i].visualid, visuals[i].depth,
- visuals[i].red_mask, visuals[i].green_mask,
- visuals[i].blue_mask);
- /*
- * save the visual index and it's depth, if this is the first
- * truecolor visul, or a visual that is 'preferred' over the
- * previous 'best' visual
- */
- if (bestvisual_depth == -1
- || (visuals[i].depth >= 15
- && ( visuals[i].depth < bestvisual_depth
- || bestvisual_depth < 15))) {
- bestvisual = i;
- bestvisual_depth = visuals[i].depth;
- }
- }
-
- if (bestvisual != -1 && visual_return != NULL)
- *visual_return = visuals[bestvisual].visual;
-
- XFree(visuals);
- }
- return bestvisual_depth;
+ XVisualInfo visual_tmpl;
+ XVisualInfo *visuals;
+ int nvisuals, i;
+ int bestvisual = -1;
+ int bestvisual_depth = -1;
+
+ visual_tmpl.screen = screen;
+ visual_tmpl.class = TrueColor;
+ visuals = XGetVisualInfo(dpy,
+ VisualScreenMask | VisualClassMask,
+ &visual_tmpl, &nvisuals);
+ if (visuals != NULL)
+ {
+ for (i = 0; i < nvisuals; i++)
+ {
+ mp_msg(MSGT_VO, MSGL_V,
+ "vo: X11 truecolor visual %#x, depth %d, R:%lX G:%lX B:%lX\n",
+ visuals[i].visualid, visuals[i].depth,
+ visuals[i].red_mask, visuals[i].green_mask,
+ visuals[i].blue_mask);
+ /*
+ * save the visual index and it's depth, if this is the first
+ * truecolor visul, or a visual that is 'preferred' over the
+ * previous 'best' visual
+ */
+ if (bestvisual_depth == -1
+ || (visuals[i].depth >= 15
+ && (visuals[i].depth < bestvisual_depth
+ || bestvisual_depth < 15)))
+ {
+ bestvisual = i;
+ bestvisual_depth = visuals[i].depth;
+ }
+ }
+
+ if (bestvisual != -1 && visual_return != NULL)
+ *visual_return = visuals[bestvisual].visual;
+
+ XFree(visuals);
+ }
+ return bestvisual_depth;
}
@@ -1522,45 +1909,58 @@
static int cm_size, red_mask, green_mask, blue_mask;
-Colormap vo_x11_create_colormap(XVisualInfo *vinfo)
+Colormap vo_x11_create_colormap(XVisualInfo * vinfo)
{
- unsigned k, r, g, b, ru, gu, bu, m, rv, gv, bv, rvu, gvu, bvu;
+ unsigned k, r, g, b, ru, gu, bu, m, rv, gv, bv, rvu, gvu, bvu;
- if (vinfo->class != DirectColor)
- return XCreateColormap(mDisplay, mRootWin, vinfo->visual, AllocNone);
+ if (vinfo->class != DirectColor)
+ return XCreateColormap(mDisplay, mRootWin, vinfo->visual,
+ AllocNone);
+
+ /* can this function get called twice or more? */
+ if (cmap)
+ return cmap;
+ cm_size = vinfo->colormap_size;
+ red_mask = vinfo->red_mask;
+ green_mask = vinfo->green_mask;
+ blue_mask = vinfo->blue_mask;
+ ru = (red_mask & (red_mask - 1)) ^ red_mask;
+ gu = (green_mask & (green_mask - 1)) ^ green_mask;
+ bu = (blue_mask & (blue_mask - 1)) ^ blue_mask;
+ rvu = 65536ull * ru / (red_mask + ru);
+ gvu = 65536ull * gu / (green_mask + gu);
+ bvu = 65536ull * bu / (blue_mask + bu);
+ r = g = b = 0;
+ rv = gv = bv = 0;
+ m = DoRed | DoGreen | DoBlue;
+ for (k = 0; k < cm_size; k++)
+ {
+ int t;
- /* can this function get called twice or more? */
- if (cmap) return cmap;
- cm_size = vinfo->colormap_size;
- red_mask = vinfo->red_mask;
- green_mask = vinfo->green_mask;
- blue_mask = vinfo->blue_mask;
- ru = (red_mask&(red_mask-1))^red_mask;
- gu = (green_mask&(green_mask-1))^green_mask;
- bu = (blue_mask&(blue_mask-1))^blue_mask;
- rvu = 65536ull*ru/(red_mask + ru);
- gvu = 65536ull*gu/(green_mask + gu);
- bvu = 65536ull*bu/(blue_mask + bu);
- r = g = b = 0;
- rv = gv = bv = 0;
- m = DoRed|DoGreen|DoBlue;
- for (k = 0; k < cm_size; k++) {
- int t;
- cols[k].pixel = r|g|b;
- cols[k].red = rv;
- cols[k].green = gv;
- cols[k].blue = bv;
- cols[k].flags = m;
- t = (r + ru) & red_mask; if (t < r) m &= ~DoRed; r = t;
- t = (g + gu) & green_mask; if (t < g) m &= ~DoGreen; g = t;
- t = (b + bu) & blue_mask; if (t < b) m &= ~DoBlue; b = t;
- rv += rvu;
- gv += gvu;
- bv += bvu;
- }
- cmap = XCreateColormap(mDisplay, mRootWin, vinfo->visual, AllocAll);
- XStoreColors(mDisplay, cmap, cols, cm_size);
- return cmap;
+ cols[k].pixel = r | g | b;
+ cols[k].red = rv;
+ cols[k].green = gv;
+ cols[k].blue = bv;
+ cols[k].flags = m;
+ t = (r + ru) & red_mask;
+ if (t < r)
+ m &= ~DoRed;
+ r = t;
+ t = (g + gu) & green_mask;
+ if (t < g)
+ m &= ~DoGreen;
+ g = t;
+ t = (b + bu) & blue_mask;
+ if (t < b)
+ m &= ~DoBlue;
+ b = t;
+ rv += rvu;
+ gv += gvu;
+ bv += bvu;
+ }
+ cmap = XCreateColormap(mDisplay, mRootWin, vinfo->visual, AllocAll);
+ XStoreColors(mDisplay, cmap, cols, cm_size);
+ return cmap;
}
/*
@@ -1577,208 +1977,230 @@
uint32_t vo_x11_set_equalizer(char *name, int value)
{
- float gamma, brightness, contrast;
- float rf, gf, bf;
- int k;
-
- /*
- * IMPLEMENTME: consider using XF86VidModeSetGammaRamp in the case
- * of TrueColor-ed window but be careful:
- * unlike the colormaps, which are private for the X client
- * who created them and thus automatically destroyed on client
- * disconnect, this gamma ramp is a system-wide (X-server-wide)
- * setting and _must_ be restored before the process exit.
- * Unforunately when the process crashes (or get killed
- * for some reason) it is impossible to restore the setting,
- * and such behaviour could be rather annoying for the users.
- */
- if (cmap == None) return VO_NOTAVAIL;
-
- if (!strcasecmp(name, "brightness")) vo_brightness = value;
- else if (!strcasecmp(name, "contrast")) vo_contrast = value;
- else if (!strcasecmp(name, "gamma")) vo_gamma = value;
- else return VO_NOTIMPL;
-
- brightness = 0.01*vo_brightness;
- contrast = tan(0.0095*(vo_contrast+100)*M_PI/4);
- gamma = pow(2, -0.02*vo_gamma);
-
- rf = (float)((red_mask & (red_mask - 1)) ^ red_mask)/red_mask;
- gf = (float)((green_mask & (green_mask - 1)) ^ green_mask)/green_mask;
- bf = (float)((blue_mask & (blue_mask - 1)) ^ blue_mask)/blue_mask;
-
- /* now recalculate the colormap using the newly set value */
- for (k = 0; k < cm_size; k++) {
- float s;
-
- s = pow(rf*k, gamma);
- s = (s - 0.5)*contrast + 0.5;
- s += brightness;
- if (s < 0) s = 0;
- if (s > 1) s = 1;
- cols[k].red = (unsigned short)(s * 65535);
-
- s = pow(gf*k, gamma);
- s = (s - 0.5)*contrast + 0.5;
- s += brightness;
- if (s < 0) s = 0;
- if (s > 1) s = 1;
- cols[k].green = (unsigned short)(s * 65535);
-
- s = pow(bf*k, gamma);
- s = (s - 0.5)*contrast + 0.5;
- s += brightness;
- if (s < 0) s = 0;
- if (s > 1) s = 1;
- cols[k].blue = (unsigned short)(s * 65535);
- }
-
- XStoreColors(mDisplay, cmap, cols, cm_size);
- XFlush(mDisplay);
- return VO_TRUE;
+ float gamma, brightness, contrast;
+ float rf, gf, bf;
+ int k;
+
+ /*
+ * IMPLEMENTME: consider using XF86VidModeSetGammaRamp in the case
+ * of TrueColor-ed window but be careful:
+ * unlike the colormaps, which are private for the X client
+ * who created them and thus automatically destroyed on client
+ * disconnect, this gamma ramp is a system-wide (X-server-wide)
+ * setting and _must_ be restored before the process exit.
+ * Unforunately when the process crashes (or get killed
+ * for some reason) it is impossible to restore the setting,
+ * and such behaviour could be rather annoying for the users.
+ */
+ if (cmap == None)
+ return VO_NOTAVAIL;
+
+ if (!strcasecmp(name, "brightness"))
+ vo_brightness = value;
+ else if (!strcasecmp(name, "contrast"))
+ vo_contrast = value;
+ else if (!strcasecmp(name, "gamma"))
+ vo_gamma = value;
+ else
+ return VO_NOTIMPL;
+
+ brightness = 0.01 * vo_brightness;
+ contrast = tan(0.0095 * (vo_contrast + 100) * M_PI / 4);
+ gamma = pow(2, -0.02 * vo_gamma);
+
+ rf = (float) ((red_mask & (red_mask - 1)) ^ red_mask) / red_mask;
+ gf = (float) ((green_mask & (green_mask - 1)) ^ green_mask) /
+ green_mask;
+ bf = (float) ((blue_mask & (blue_mask - 1)) ^ blue_mask) / blue_mask;
+
+ /* now recalculate the colormap using the newly set value */
+ for (k = 0; k < cm_size; k++)
+ {
+ float s;
+
+ s = pow(rf * k, gamma);
+ s = (s - 0.5) * contrast + 0.5;
+ s += brightness;
+ if (s < 0)
+ s = 0;
+ if (s > 1)
+ s = 1;
+ cols[k].red = (unsigned short) (s * 65535);
+
+ s = pow(gf * k, gamma);
+ s = (s - 0.5) * contrast + 0.5;
+ s += brightness;
+ if (s < 0)
+ s = 0;
+ if (s > 1)
+ s = 1;
+ cols[k].green = (unsigned short) (s * 65535);
+
+ s = pow(bf * k, gamma);
+ s = (s - 0.5) * contrast + 0.5;
+ s += brightness;
+ if (s < 0)
+ s = 0;
+ if (s > 1)
+ s = 1;
+ cols[k].blue = (unsigned short) (s * 65535);
+ }
+
+ XStoreColors(mDisplay, cmap, cols, cm_size);
+ XFlush(mDisplay);
+ return VO_TRUE;
}
uint32_t vo_x11_get_equalizer(char *name, int *value)
{
- if (cmap == None) return VO_NOTAVAIL;
- if (!strcasecmp(name, "brightness")) *value = vo_brightness;
- else if (!strcasecmp(name, "contrast")) *value = vo_contrast;
- else if (!strcasecmp(name, "gamma")) *value = vo_gamma;
- else return VO_NOTIMPL;
- return VO_TRUE;
+ if (cmap == None)
+ return VO_NOTAVAIL;
+ if (!strcasecmp(name, "brightness"))
+ *value = vo_brightness;
+ else if (!strcasecmp(name, "contrast"))
+ *value = vo_contrast;
+ else if (!strcasecmp(name, "gamma"))
+ *value = vo_gamma;
+ else
+ return VO_NOTIMPL;
+ return VO_TRUE;
}
+
#ifdef HAVE_XV
int vo_xv_set_eq(uint32_t xv_port, char *name, int value)
{
XvAttribute *attributes;
- int i,howmany, xv_atom;
+ int i, howmany, xv_atom;
mp_dbg(MSGT_VO, MSGL_V, "xv_set_eq called! (%s, %d)\n", name, value);
/* get available attributes */
attributes = XvQueryPortAttributes(mDisplay, xv_port, &howmany);
for (i = 0; i < howmany && attributes; i++)
- if (attributes[i].flags & XvSettable)
- {
- xv_atom = XInternAtom(mDisplay, attributes[i].name, True);
+ if (attributes[i].flags & XvSettable)
+ {
+ xv_atom = XInternAtom(mDisplay, attributes[i].name, True);
/* since we have SET_DEFAULTS first in our list, we can check if it's available
then trigger it if it's ok so that the other values are at default upon query */
- if (xv_atom != None)
- {
- int hue = 0,port_value,port_min,port_max;
+ if (xv_atom != None)
+ {
+ int hue = 0, port_value, port_min, port_max;
- if(!strcmp(attributes[i].name,"XV_BRIGHTNESS") &&
- (!strcasecmp(name, "brightness")))
- port_value = value;
- else
- if(!strcmp(attributes[i].name,"XV_CONTRAST") &&
- (!strcasecmp(name, "contrast")))
- port_value = value;
- else
- if(!strcmp(attributes[i].name,"XV_SATURATION") &&
- (!strcasecmp(name, "saturation")))
- port_value = value;
- else
- if(!strcmp(attributes[i].name,"XV_HUE") &&
- (!strcasecmp(name, "hue")))
- { port_value = value; hue=1; }
- else
+ if (!strcmp(attributes[i].name, "XV_BRIGHTNESS") &&
+ (!strcasecmp(name, "brightness")))
+ port_value = value;
+ else if (!strcmp(attributes[i].name, "XV_CONTRAST") &&
+ (!strcasecmp(name, "contrast")))
+ port_value = value;
+ else if (!strcmp(attributes[i].name, "XV_SATURATION") &&
+ (!strcasecmp(name, "saturation")))
+ port_value = value;
+ else if (!strcmp(attributes[i].name, "XV_HUE") &&
+ (!strcasecmp(name, "hue")))
+ {
+ port_value = value;
+ hue = 1;
+ } else
/* Note: since 22.01.2002 GATOS supports these attrs for radeons (NK) */
- if(!strcmp(attributes[i].name,"XV_RED_INTENSITY") &&
- (!strcasecmp(name, "red_intensity")))
- port_value = value;
- else
- if(!strcmp(attributes[i].name,"XV_GREEN_INTENSITY") &&
- (!strcasecmp(name, "green_intensity")))
- port_value = value;
- else
- if(!strcmp(attributes[i].name,"XV_BLUE_INTENSITY") &&
- (!strcasecmp(name, "blue_intensity")))
- port_value = value;
- else continue;
-
- port_min = attributes[i].min_value;
- port_max = attributes[i].max_value;
-
- /* nvidia hue workaround */
- if ( hue && port_min == 0 && port_max == 360 ){
- port_value = (port_value>=0) ? (port_value-100) : (port_value+100);
- }
-
- // -100 -> min
- // 0 -> (max+min)/2
- // +100 -> max
- port_value = (port_value+100)*(port_max-port_min)/200+port_min;
- XvSetPortAttribute(mDisplay, xv_port, xv_atom, port_value);
- return(VO_TRUE);
+ if (!strcmp(attributes[i].name, "XV_RED_INTENSITY") &&
+ (!strcasecmp(name, "red_intensity")))
+ port_value = value;
+ else if (!strcmp(attributes[i].name, "XV_GREEN_INTENSITY")
+ && (!strcasecmp(name, "green_intensity")))
+ port_value = value;
+ else if (!strcmp(attributes[i].name, "XV_BLUE_INTENSITY")
+ && (!strcasecmp(name, "blue_intensity")))
+ port_value = value;
+ else
+ continue;
+
+ port_min = attributes[i].min_value;
+ port_max = attributes[i].max_value;
+
+ /* nvidia hue workaround */
+ if (hue && port_min == 0 && port_max == 360)
+ {
+ port_value =
+ (port_value >=
+ 0) ? (port_value - 100) : (port_value + 100);
}
- }
- return(VO_FALSE);
+ // -100 -> min
+ // 0 -> (max+min)/2
+ // +100 -> max
+ port_value =
+ (port_value + 100) * (port_max - port_min) / 200 +
+ port_min;
+ XvSetPortAttribute(mDisplay, xv_port, xv_atom, port_value);
+ return (VO_TRUE);
+ }
+ }
+ return (VO_FALSE);
}
int vo_xv_get_eq(uint32_t xv_port, char *name, int *value)
{
-
+
XvAttribute *attributes;
- int i,howmany, xv_atom;
+ int i, howmany, xv_atom;
/* get available attributes */
attributes = XvQueryPortAttributes(mDisplay, xv_port, &howmany);
for (i = 0; i < howmany && attributes; i++)
- if (attributes[i].flags & XvGettable)
- {
- xv_atom = XInternAtom(mDisplay, attributes[i].name, True);
+ if (attributes[i].flags & XvGettable)
+ {
+ xv_atom = XInternAtom(mDisplay, attributes[i].name, True);
/* since we have SET_DEFAULTS first in our list, we can check if it's available
then trigger it if it's ok so that the other values are at default upon query */
- if (xv_atom != None)
- {
- int val, port_value=0, port_min, port_max;
+ if (xv_atom != None)
+ {
+ int val, port_value = 0, port_min, port_max;
- XvGetPortAttribute(mDisplay, xv_port, xv_atom, &port_value);
+ XvGetPortAttribute(mDisplay, xv_port, xv_atom,
+ &port_value);
- port_min = attributes[i].min_value;
- port_max = attributes[i].max_value;
- val=(port_value-port_min)*200/(port_max-port_min)-100;
-
- if(!strcmp(attributes[i].name,"XV_BRIGHTNESS") &&
- (!strcasecmp(name, "brightness")))
- *value = val;
- else
- if(!strcmp(attributes[i].name,"XV_CONTRAST") &&
- (!strcasecmp(name, "contrast")))
- *value = val;
- else
- if(!strcmp(attributes[i].name,"XV_SATURATION") &&
- (!strcasecmp(name, "saturation")))
- *value = val;
- else
- if(!strcmp(attributes[i].name,"XV_HUE") &&
- (!strcasecmp(name, "hue"))){
- /* nasty nvidia detect */
- if (port_min == 0 && port_max == 360)
- *value = (val>=0) ? (val-100) : (val+100);
- else
- *value = val;
- } else
+ port_min = attributes[i].min_value;
+ port_max = attributes[i].max_value;
+ val =
+ (port_value - port_min) * 200 / (port_max - port_min) -
+ 100;
+
+ if (!strcmp(attributes[i].name, "XV_BRIGHTNESS") &&
+ (!strcasecmp(name, "brightness")))
+ *value = val;
+ else if (!strcmp(attributes[i].name, "XV_CONTRAST") &&
+ (!strcasecmp(name, "contrast")))
+ *value = val;
+ else if (!strcmp(attributes[i].name, "XV_SATURATION") &&
+ (!strcasecmp(name, "saturation")))
+ *value = val;
+ else if (!strcmp(attributes[i].name, "XV_HUE") &&
+ (!strcasecmp(name, "hue")))
+ {
+ /* nasty nvidia detect */
+ if (port_min == 0 && port_max == 360)
+ *value = (val >= 0) ? (val - 100) : (val + 100);
+ else
+ *value = val;
+ } else
/* Note: since 22.01.2002 GATOS supports these attrs for radeons (NK) */
- if(!strcmp(attributes[i].name,"XV_RED_INTENSITY") &&
- (!strcasecmp(name, "red_intensity")))
- *value = val;
- else
- if(!strcmp(attributes[i].name,"XV_GREEN_INTENSITY") &&
- (!strcasecmp(name, "green_intensity")))
- *value = val;
- else
- if(!strcmp(attributes[i].name,"XV_BLUE_INTENSITY") &&
- (!strcasecmp(name, "blue_intensity")))
- *value = val;
- else continue;
-
- mp_dbg(MSGT_VO, MSGL_V, "xv_get_eq called! (%s, %d)\n", name, *value);
- return(VO_TRUE);
- }
- }
- return(VO_FALSE);
+ if (!strcmp(attributes[i].name, "XV_RED_INTENSITY") &&
+ (!strcasecmp(name, "red_intensity")))
+ *value = val;
+ else if (!strcmp(attributes[i].name, "XV_GREEN_INTENSITY")
+ && (!strcasecmp(name, "green_intensity")))
+ *value = val;
+ else if (!strcmp(attributes[i].name, "XV_BLUE_INTENSITY")
+ && (!strcasecmp(name, "blue_intensity")))
+ *value = val;
+ else
+ continue;
+
+ mp_dbg(MSGT_VO, MSGL_V, "xv_get_eq called! (%s, %d)\n",
+ name, *value);
+ return (VO_TRUE);
+ }
+ }
+ return (VO_FALSE);
}
#endif
- Previous message: [Mplayer-cvslog] CVS: main/libvo vo_dga.c, 1.68, 1.69 vo_x11.c, 1.137, 1.138 vo_xmga.c, 1.86, 1.87 vo_xv.c, 1.151, 1.152 vo_xvidix.c, 1.66, 1.67 x11_common.c, 1.172, 1.173
- Next message: [Mplayer-cvslog] CVS: main configure,1.869,1.870
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the MPlayer-cvslog
mailing list