Mercurial > mplayer.hg
changeset 31:1fc618eba830
added check_events() interface
author | arpi_esp |
---|---|
date | Sat, 03 Mar 2001 21:46:39 +0000 |
parents | 3af750fac6c1 |
children | 9e66f722790e |
files | libvo/Makefile libvo/mga_common.c libvo/video_out.c libvo/video_out.h libvo/video_out_internal.h libvo/vo_3dfx.c libvo/vo_dga.c libvo/vo_gl.c libvo/vo_md5.c libvo/vo_mga.c libvo/vo_null.c libvo/vo_odivx.c libvo/vo_pgm.c libvo/vo_sdl.c libvo/vo_syncfb.c libvo/vo_x11.c libvo/vo_xmga.c libvo/vo_xv.c |
diffstat | 18 files changed, 160 insertions(+), 424 deletions(-) [+] |
line wrap: on
line diff
--- a/libvo/Makefile Fri Mar 02 22:24:16 2001 +0000 +++ b/libvo/Makefile Sat Mar 03 21:46:39 2001 +0000 @@ -3,8 +3,8 @@ LIBNAME = libvo.a -SRCS=rgb15to16mmx.c yuv2rgb_mmx.c yuv2rgb.c video_out.c vo_null.c vo_pgm.c vo_md5.c vo_odivx.c $(OPTIONAL_SRCS) -OBJS=rgb15to16mmx.o yuv2rgb_mmx.o yuv2rgb.o video_out.o vo_null.o vo_pgm.o vo_md5.o vo_odivx.o $(OPTIONAL_OBJS) +SRCS=rgb15to16mmx.c yuv2rgb_mmx.c yuv2rgb.c video_out.c vo_null.c vo_pgm.c vo_md5.c vo_odivx.c x11_common.c $(OPTIONAL_SRCS) +OBJS=rgb15to16mmx.o yuv2rgb_mmx.o yuv2rgb.o video_out.o vo_null.o vo_pgm.o vo_md5.o vo_odivx.o x11_common.o $(OPTIONAL_OBJS) CFLAGS = $(OPTFLAGS) -I. -I.. -DMPG12PLAY # -I/usr/X11R6/include/
--- a/libvo/mga_common.c Fri Mar 02 22:24:16 2001 +0000 +++ b/libvo/mga_common.c Sat Mar 03 21:46:39 2001 +0000 @@ -152,7 +152,7 @@ } static void -flip_page(void) +vo_mga_flip_page(void) { #if 0 ioctl(f,MGA_VID_FSEL,&next_frame);
--- a/libvo/video_out.c Fri Mar 02 22:24:16 2001 +0000 +++ b/libvo/video_out.c Sat Mar 03 21:46:39 2001 +0000 @@ -85,121 +85,4 @@ NULL }; -#ifdef X11_FULLSCREEN -#include <X11/Xlib.h> -#include <X11/Xutil.h> -#include <X11/Xatom.h> - -int vo_depthonscreen=0; -int vo_screenwidth=0; -int vo_screenheight=0; - -int vo_init( void ) -{ - int CompletionType = -1; - int mScreen; - int bpp; - char * DisplayName = ":0.0"; - Display * mDisplay; - XImage * mXImage; - Window mRootWin; - static XWindowAttributes attribs; - - if(vo_depthonscreen) return 1; // already called - - if ( getenv( "DISPLAY" ) ) DisplayName=getenv( "DISPLAY" ); - mDisplay=XOpenDisplay( DisplayName ); - if ( !mDisplay ) - { - fprintf( stderr,"vo: couldn't open the X11 display!\n" ); - return 0; - } - mScreen=DefaultScreen( mDisplay ); // Screen ID. - mRootWin=RootWindow( mDisplay,mScreen );// Root window ID. - vo_screenwidth=DisplayWidth( mDisplay,mScreen ); - vo_screenheight=DisplayHeight( mDisplay,mScreen ); - // get color depth: -// XGetWindowAttributes(mydisplay, DefaultRootWindow(mDisplay), &attribs); - XGetWindowAttributes(mDisplay, mRootWin, &attribs); - vo_depthonscreen=attribs.depth; - // get bits/pixel: - mXImage=XGetImage( mDisplay,mRootWin,0,0,1,1,AllPlanes,ZPixmap ); - bpp=mXImage->bits_per_pixel; - XDestroyImage( mXImage ); - if((vo_depthonscreen+7)/8 != (bpp+7)/8) vo_depthonscreen=bpp; // by A'rpi - XCloseDisplay( mDisplay ); - printf("X11 running at %dx%d depth: %d\n",vo_screenwidth,vo_screenheight,vo_depthonscreen); - return 1; -} - -#include "../linux/keycodes.h" -extern void mplayer_put_key(int code); - -void vo_keyboard( 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 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; - } -} - - -// ----- Motif header: ------- - -#define MWM_HINTS_DECORATIONS 2 - -typedef struct -{ - long flags; - long functions; - long decorations; - long input_mode; -} 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_decoration( Display * vo_Display,Window w,int d ) -{ - vo_MotifHints=XInternAtom( vo_Display,"_MOTIF_WM_HINTS",0 ); - if ( vo_MotifHints != None ) - { - vo_MotifWmHints.flags=2; - vo_MotifWmHints.decorations=d; - XChangeProperty( vo_Display,w,vo_MotifHints,vo_MotifHints,32, - PropModeReplace,(unsigned char *)&vo_MotifWmHints,4 ); - } -} - -#include <signal.h> - -int vo_eventhandler_pid=-1; - -void vo_kill_eventhandler(){ - if(vo_eventhandler_pid!=-1) kill(vo_eventhandler_pid,SIGTERM); - -} - -#endif -
--- a/libvo/video_out.h Fri Mar 02 22:24:16 2001 +0000 +++ b/libvo/video_out.h Sat Mar 03 21:46:39 2001 +0000 @@ -2,29 +2,10 @@ * video_out.h * * Copyright (C) Aaron Holtzman - Aug 1999 - * - * This file is part of mpeg2dec, a free MPEG-2 video stream decoder. - * - * mpeg2dec is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * mpeg2dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Make; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * Strongly modified, most parts rewritten: A'rpi/ESP-team - 2000-2001 * */ -#ifdef __cplusplus -extern "C" { -#endif - #include <inttypes.h> #define IMGFMT_YV12 0x32315659 @@ -40,6 +21,10 @@ #define IMGFMT_RGB24 (IMGFMT_RGB|24) #define IMGFMT_RGB32 (IMGFMT_RGB|32) +#define VO_EVENT_EXPOSE 1 +#define VO_EVENT_RESIZE 2 +#define VO_EVENT_KEYPRESS 4 + typedef struct vo_info_s { /* driver name ("Matrox Millennium G200/G400" */ @@ -52,119 +37,65 @@ const char *comment; } vo_info_t; -typedef struct vo_image_buffer_s -{ - uint32_t height; - uint32_t width; - uint32_t format; - uint8_t *base; - void *private; -} vo_image_buffer_t; - typedef struct vo_functions_s { /* * Initialize the display driver. - * - * params : width == width of video to display. - * height == height of video to display. - * fullscreen == non-zero if driver should attempt to - * render in fullscreen mode. Zero if - * a windowed mode is requested. This is - * merely a request; if the driver can only do - * fullscreen (like fbcon) or windowed (like X11), - * than this param may be disregarded. - * title == string for titlebar of window. May be disregarded - * if there is no such thing as a window to your - * driver. Make a copy of this string, if you need it. - * format == desired fourCC code to use for image buffers - * returns : zero on successful initialization, non-zero on error. - * The program will probably respond to an error condition - * by terminating. + * params: + * width,height: image source size + * d_width,d_height: size of the requested window size, just a hint + * fullscreen: flag, 0=windowd 1=fullscreen, just a hint + * title: window title, if available + * format: fourcc of pixel format + * returns : zero on successful initialization, non-zero on error. */ - uint32_t (*init)(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint32_t fullscreen, char *title, uint32_t format); + /* + * Query that given pixel format is supported or not. + * params: + * format: fourcc of pixel format + * returns : 1 if supported, 0 if unsupported + */ uint32_t (*query_format)(uint32_t format); /* * Return driver information. - * - * params : none. * returns : read-only pointer to a vo_info_t structure. - * Fields are non-NULL. - * Should not return NULL. */ - const vo_info_t* (*get_info)(void); /* - * Display a new frame of the video to the screen. This may get called very - * rapidly, so the more efficient you can make your implementation of this - * function, the better. - * - * params : *src[] == An array with three elements. This is a YUV - * stream, with the Y plane in src[0], U in src[1], - * and V in src[2]. There is enough data for an image - * that is (WxH) pixels, where W and H are the width - * and height parameters that were previously passed - * to display_init(). - * Information on the YUV format can be found at: - * http://www.webartz.com/fourcc/fccyuv.htm#IYUV - * - * returns : zero on successful rendering, non-zero on error. - * The program will probably respond to an error condition - * by terminating. + * Display a new RGB/BGR frame of the video to the screen. + * params: + * src[0] - pointer to the image */ - uint32_t (*draw_frame)(uint8_t *src[]); /* - * Update a section of the offscreen buffer. A "slice" is an area of the - * video image that is 16 rows of pixels at the width of the video image. - * Position (0, 0) is the upper left corner of slice #0 (the first slice), - * and position (0, 15) is the lower right. The next slice, #1, is bounded - * by (0, 16) and (0, 31), and so on. - * - * Note that slices are not drawn directly to the screen, and should be - * buffered until your implementation of display_flip_page() (see below) - * is called. - * - * This may get called very rapidly, so the more efficient you can make your - * implementation of this function, the better. - * - * params : *src[] == see display_frame(), above. The data passed in this - * array is just what enough data to contain the - * new slice, and NOT the entire frame. - * slice_num == The index of the slice. Starts at 0, not 1. - * - * returns : zero on successful rendering, non-zero on error. - * The program will probably respond to an error condition - * by terminating. + * Draw a planar YUV slice to the buffer: + * params: + * src[3] = source image planes (Y,U,V) + * stride[3] = source image planes line widths (in bytes) + * w,h = width*height of area to be copied (in Y pixels) + * x,y = position at the destination image (in Y pixels) */ - - // src[3] = source image planes (Y,U,V) - // stride[3] = source image planes line widths (in bytes) - // w,h = width*height of area to be copied (in Y pixels) - // x,y = position at the destination image (in Y pixels) - uint32_t (*draw_slice)(uint8_t *src[], int stride[], int w,int h, int x,int y); /* - * Draw the current image buffer to the screen. There may be several - * display_slice() calls before display_flip_page() is used. Note that - * display_frame does an implicit page flip, so you might or might not - * want to call this internally from your display_frame() implementation. - * - * This may get called very rapidly, so the more efficient you can make - * your implementation of this function, the better. - * - * params : void. - * returns : void. + * Blit/Flip buffer to the screen. Must be called after each frame! */ - void (*flip_page)(void); + /* + * This func is called after every frames to handle keyboard and + * other events. It's called in PAUSE mode too! + */ + void (*check_events)(void); + + /* + * Closes driver. Should restore the original state of the system. + */ void (*uninit)(void); } vo_functions_t; @@ -172,24 +103,3 @@ // NULL terminated array of all drivers extern vo_functions_t* video_out_drivers[]; - -#ifdef X11_FULLSCREEN - -// X11 keyboard codes -#include "wskeys.h" - -extern int vo_depthonscreen; -extern int vo_screenwidth; -extern int vo_screenheight; -int vo_init( void ); -//void vo_decoration( Display * vo_Display,Window w,int d ); - -extern int vo_eventhandler_pid; -void vo_kill_eventhandler(); - -#endif - - -#ifdef __cplusplus -} -#endif
--- a/libvo/video_out_internal.h Fri Mar 02 22:24:16 2001 +0000 +++ b/libvo/video_out_internal.h Sat Mar 03 21:46:39 2001 +0000 @@ -24,9 +24,9 @@ static uint32_t init(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint32_t fullscreen, char *title, uint32_t format); static const vo_info_t* get_info(void); static uint32_t draw_frame(uint8_t *src[]); -//static uint32_t draw_slice(uint8_t *src[], uint32_t slice_num); static uint32_t draw_slice(uint8_t *image[], int stride[], int w,int h,int x,int y); static void flip_page(void); +static void check_events(void); static void uninit(void); static uint32_t query_format(uint32_t format); @@ -38,6 +38,6 @@ draw_frame,\ draw_slice,\ flip_page,\ + check_events,\ uninit,\ }; -
--- a/libvo/vo_3dfx.c Fri Mar 02 22:24:16 2001 +0000 +++ b/libvo/vo_3dfx.c Sat Mar 03 21:46:39 2001 +0000 @@ -476,3 +476,8 @@ } +static void check_events(void) +{ +} + +
--- a/libvo/vo_dga.c Fri Mar 02 22:24:16 2001 +0000 +++ b/libvo/vo_dga.c Sat Mar 03 21:46:39 2001 +0000 @@ -34,6 +34,7 @@ #include <X11/Xlib.h> #include <X11/extensions/xf86dga.h> +#include "x11_common.h" static vo_info_t vo_info = { @@ -43,28 +44,26 @@ "" }; -int vo_dga_width; // bytes per line in framebuffer -int vo_dga_vp_width; // visible pixels per line in framebuffer -int vo_dga_vp_height; // visible lines in framebuffer -int vo_dga_is_running = 0; -int vo_dga_src_width; // width of video in pixels -int vo_dga_src_height; // height of video in pixels -int vo_dga_bpp; // bytes per pixel in framebuffer -int vo_dga_src_offset=0; // offset in src -int vo_dga_vp_offset=0; // offset in dest -int vo_dga_bytes_per_line; // longwords per line to copy -int vo_dga_src_skip; // bytes to skip after copying one line +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_bpp; // bytes per pixel in framebuffer +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; // longwords per line to copy +static int vo_dga_src_skip; // bytes to skip after copying one line // (not supported yet) in src -int vo_dga_vp_skip; // dto. for dest -int vo_dga_lines; // num of lines to copy -int vo_dga_src_format; +static int vo_dga_vp_skip; // dto. for dest +static int vo_dga_lines; // num of lines to copy +static int vo_dga_src_format; -unsigned char *vo_dga_base; -Display *vo_dga_dpy; +static unsigned char *vo_dga_base; +static Display *vo_dga_dpy; -extern void vo_decoration( Display * vo_Display,Window w,int d ); - #include "mmx.h" #if defined (HAVE_SSE) || defined (HAVE_3DNOW) @@ -170,8 +169,13 @@ return 0; } +static void check_events(void) +{ + int e=vo_x11_check_events(vo_dga_dpy); +} + static void flip_page( void ){ - + check_events(); // printf("vo_dga: In flippage\n"); } @@ -314,7 +318,7 @@ return 0; } - +#if 0 int vo_dga_query_event(void){ XEvent myevent; @@ -366,6 +370,7 @@ } return retval; } +#endif
--- a/libvo/vo_gl.c Fri Mar 02 22:24:16 2001 +0000 +++ b/libvo/vo_gl.c Sat Mar 03 21:46:39 2001 +0000 @@ -32,6 +32,8 @@ #include <GL/gl.h> +#include "x11_common.h" + static vo_info_t vo_info = { "X11 (OpenGL)", @@ -89,8 +91,6 @@ glLoadIdentity(); } -extern void vo_decoration( Display * vo_Display,Window w,int d ); - /* connect to server, create and map window, * allocate colors and (shared) memory */ @@ -189,7 +189,7 @@ // printf("GLXcontext ok\n"); - if ( fullscreen ) vo_decoration( mydisplay,mywindow,0 ); + if ( fullscreen ) vo_x11_decoration( mydisplay,mywindow,0 ); XSelectInput(mydisplay, mywindow, StructureNotifyMask); @@ -317,30 +317,19 @@ X_already_started = 0; } -static void -FlipImage() + +static void check_events(void) { - int i; - XEvent Event; - char buf[100]; - KeySym keySym; - XComposeStatus stat; - unsigned long vo_KeyTable[512]; + int e=vo_x11_check_events(mydisplay); + if(e&VO_EVENT_RESIZE) resize(vo_dwidth,vo_dheight); +} - while ( XPending( mydisplay ) ) - { - XNextEvent( mydisplay,&Event ); - switch( Event.type ) - { - case ConfigureNotify: - resize( Event.xconfigure.width,Event.xconfigure.height ); - break; - case KeyPress: - XLookupString( &Event.xkey,buf,sizeof(buf),&keySym,&stat ); - vo_keyboard( ( (keySym&0xff00) != 0?( (keySym&0x00ff) + 256 ):( keySym ) ) ); - break; - } - } + +static void +flip_page(void) +{ + + check_events(); // glEnable(GL_TEXTURE_2D); // glBindTexture(GL_TEXTURE_2D, texture_id); @@ -359,12 +348,6 @@ } -static void -flip_page(void) -{ - FlipImage(); -} - //static inline uint32_t draw_slice_x11(uint8_t *src[], uint32_t slice_num) static uint32_t draw_slice(uint8_t *src[], int stride[], int w,int h,int x,int y) { @@ -418,7 +401,6 @@ } // Display_Image(ImageData); -// FlipImage(); return 0; } @@ -452,7 +434,6 @@ } // Display_Image(ImageData); -// FlipImage(); return 0; } @@ -476,7 +457,6 @@ } // Display_Image(ImageData); -// FlipImage(); return 0; } @@ -509,7 +489,5 @@ static void uninit(void) { -vo_kill_eventhandler(); } -
--- a/libvo/vo_md5.c Fri Mar 02 22:24:16 2001 +0000 +++ b/libvo/vo_md5.c Sat Mar 03 21:46:39 2001 +0000 @@ -104,3 +104,8 @@ } +static void check_events(void) +{ +} + +
--- a/libvo/vo_mga.c Fri Mar 02 22:24:16 2001 +0000 +++ b/libvo/vo_mga.c Sat Mar 03 21:46:39 2001 +0000 @@ -124,4 +124,15 @@ } +static void flip_page(void) +{ + vo_mga_flip_page(); +} + +static void check_events(void) +{ +} + + +
--- a/libvo/vo_null.c Fri Mar 02 22:24:16 2001 +0000 +++ b/libvo/vo_null.c Sat Mar 03 21:46:39 2001 +0000 @@ -82,4 +82,9 @@ } +static void check_events(void) +{ +} + +
--- a/libvo/vo_odivx.c Fri Mar 02 22:24:16 2001 +0000 +++ b/libvo/vo_odivx.c Sat Mar 03 21:46:39 2001 +0000 @@ -232,3 +232,8 @@ +static void check_events(void) +{ +} + +
--- a/libvo/vo_pgm.c Fri Mar 02 22:24:16 2001 +0000 +++ b/libvo/vo_pgm.c Sat Mar 03 21:46:39 2001 +0000 @@ -112,4 +112,9 @@ } +static void check_events(void) +{ +} + +
--- a/libvo/vo_sdl.c Fri Mar 02 22:24:16 2001 +0000 +++ b/libvo/vo_sdl.c Sat Mar 03 21:46:39 2001 +0000 @@ -603,5 +603,3 @@ sdl_close(); } - -
--- a/libvo/vo_syncfb.c Fri Mar 02 22:24:16 2001 +0000 +++ b/libvo/vo_syncfb.c Sat Mar 03 21:46:39 2001 +0000 @@ -441,6 +441,7 @@ } - +static void check_events(void) +{ +} -
--- a/libvo/vo_x11.c Fri Mar 02 22:24:16 2001 +0000 +++ b/libvo/vo_x11.c Sat Mar 03 21:46:39 2001 +0000 @@ -31,6 +31,8 @@ #include <errno.h> #include "yuv2rgb.h" +#include "x11_common.h" + static vo_info_t vo_info = { "X11 ( XImage/Shm )", @@ -57,7 +59,7 @@ static XWindowAttributes attribs; static int X_already_started=0; -static int windowwidth,windowheight; +//static int vo_dwidth,vo_dheight; #define SH_MEM @@ -95,32 +97,10 @@ static uint32_t image_height; static uint32_t image_format; -extern void vo_decoration( Display * vo_Display,Window w,int d ); - -static Bool mEvents( Display * display,XEvent * Event,XPointer arg ) -{ - int i; - char buf[100]; - KeySym keySym; - XComposeStatus stat; - unsigned long vo_KeyTable[512]; - - switch( Event->type ) - { - case ConfigureNotify: - windowwidth=Event->xconfigure.width; - windowheight=Event->xconfigure.height; - break; - case KeyPress: - XLookupString( &Event->xkey,buf,sizeof(buf),&keySym,&stat ); - vo_keyboard( ( (keySym&0xff00) != 0?( (keySym&0x00ff) + 256 ):( keySym ) ) ); - break; - } - return 0; +static void check_events(){ + int e=vo_x11_check_events(mDisplay); } -static XEvent mEvent; - static uint32_t init( uint32_t width,uint32_t height,uint32_t d_width,uint32_t d_height,uint32_t fullscreen,char *title,uint32_t format ) { int screen; @@ -163,8 +143,8 @@ hint.width=vo_screenwidth; hint.height=vo_screenheight; } - windowwidth=hint.width; - windowheight=hint.height; + vo_dwidth=hint.width; + vo_dheight=hint.height; hint.flags=PPosition | PSize; bg=WhitePixel( mDisplay,screen ); @@ -189,7 +169,7 @@ hint.width,hint.height, xswa.border_pixel,depth,CopyFromParent,vinfo.visual,xswamask,&xswa ); - if ( fullscreen ) vo_decoration( mDisplay,mywindow,0 ); + if ( fullscreen ) vo_x11_decoration( mDisplay,mywindow,0 ); XSelectInput( mDisplay,mywindow,StructureNotifyMask ); XSetStandardProperties( mDisplay,mywindow,hello,hello,None,NULL,0,&hint ); XMapWindow( mDisplay,mywindow ); @@ -302,11 +282,6 @@ // vo_initthread( mThread ); - if((vo_eventhandler_pid=fork())==0){ - XIfEvent( mDisplay,&mEvent,mEvents,NULL ); - exit(0); - } - return 0; } @@ -337,7 +312,7 @@ { XShmPutImage( mDisplay,mywindow,mygc,myximage, 0,0, - ( windowwidth - myximage->width ) / 2,( windowheight - myximage->height ) / 2, + ( vo_dwidth - myximage->width ) / 2,( vo_dheight - myximage->height ) / 2, myximage->width,myximage->height,True ); XFlush( mDisplay ); } @@ -346,15 +321,17 @@ { XPutImage( mDisplay,mywindow,mygc,myximage, 0,0, - ( windowwidth - myximage->width ) / 2,( windowheight - myximage->height ) / 2, + ( vo_dwidth - myximage->width ) / 2,( vo_dheight - myximage->height ) / 2, myximage->width,myximage->height ); XFlush( mDisplay ); } #endif } -static void flip_page( void ) -{ Display_Image( myximage,ImageData ); } +static void flip_page( void ){ + check_events(); + Display_Image( myximage,ImageData ); +} static uint32_t draw_slice( uint8_t *src[],int stride[],int w,int h,int x,int y ) { @@ -469,7 +446,6 @@ uninit(void) { printf("vo: uninit!\n"); -vo_kill_eventhandler(); }
--- a/libvo/vo_xmga.c Fri Mar 02 22:24:16 2001 +0000 +++ b/libvo/vo_xmga.c Sat Mar 03 21:46:39 2001 +0000 @@ -43,6 +43,8 @@ #include <X11/Xutil.h> #include <errno.h> +#include "x11_common.h" + static vo_info_t vo_info = { "X11 (Matrox G200/G400 overlay in window using /dev/mga_vid)", @@ -88,6 +90,7 @@ #include "mga_common.c" + static void mDrawColorKey( void ) { XClearWindow( mDisplay,mWindow ); @@ -96,20 +99,11 @@ XFlush( mDisplay ); } -static Bool mEvents( Display * display,XEvent * Event,XPointer arg ) +static void check_events(void) { - int i; - char buf[100]; - KeySym keySym; - XComposeStatus stat; - unsigned long vo_KeyTable[512]; + int e=vo_x11_check_events(mDisplay); - switch( Event->type ) - { - case Expose: - mDrawColorKey(); - break; - case ConfigureNotify: + if(e&VO_EVENT_RESIZE){ XGetGeometry( mDisplay,mWindow,&mRoot,&drwX,&drwY,&drwWidth,&drwHeight,&drwBorderWidth,&drwDepth ); drwX=0; drwY=0; XTranslateCoordinates( mDisplay,mWindow,mRoot,0,0,&drwcX,&drwcY,&mRoot ); @@ -134,18 +128,18 @@ if ( ioctl( f,MGA_VID_CONFIG,&mga_vid_config ) ) { fprintf( stderr,"Error in mga_vid_config ioctl" ); - exit( 0 ); +// exit( 0 ); } - break; - case KeyPress: - XLookupString( &Event->xkey,buf,sizeof(buf),&keySym,&stat ); - vo_keyboard( ( (keySym&0xff00) != 0?( (keySym&0x00ff) + 256 ):( keySym ) ) ); - break; - } - return 0; + + } else + if(e&VO_EVENT_EXPOSE) mDrawColorKey(); + } -static XEvent mEvent; +static void flip_page(void){ + check_events(); + vo_mga_flip_page(); +} static uint32_t init( uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint32_t fullscreen, char *title, uint32_t format ) { @@ -229,7 +223,7 @@ InputOutput, vinfo.visual,xswamask,&xWAttribs ); - if ( fullscreen ) vo_decoration( mDisplay,mWindow,0 ); + if ( fullscreen ) vo_x11_decoration( mDisplay,mWindow,0 ); XGetNormalHints( mDisplay,mWindow,&hint ); hint.x=wndX; hint.y=wndY; @@ -295,11 +289,6 @@ // vo_initthread( mThread ); - if((vo_eventhandler_pid=fork())==0){ - XIfEvent( mDisplay,&mEvent,mEvents,NULL ); - exit(0); - } - return 0; } @@ -312,7 +301,6 @@ { ioctl( f,MGA_VID_OFF,0 ); printf("vo: uninit!\n"); -vo_kill_eventhandler(); }
--- a/libvo/vo_xv.c Fri Mar 02 22:24:16 2001 +0000 +++ b/libvo/vo_xv.c Sat Mar 03 21:46:39 2001 +0000 @@ -31,6 +31,8 @@ #include <errno.h> #include "yuv2rgb.h" +#include "x11_common.h" + static vo_info_t vo_info = { "X11/Xv", @@ -59,7 +61,7 @@ static void allocate_xvimage(int); static unsigned int ver,rel,req,ev,err; static unsigned int formats, adaptors,i,xv_port,xv_format; -static int win_width,win_height; +//static int vo_dwidth,vo_dheight; static XvAdaptorInfo *ai; static XvImageFormatValues *fo; static XvImage *xvimage[1]; @@ -92,8 +94,6 @@ return depth; } -extern void vo_decoration( Display * vo_Display,Window w,int d ); - /* connect to server, create and map window, * allocate colors and (shared) memory */ @@ -191,7 +191,7 @@ XSetStandardProperties(mydisplay, mywindow, hello, hello, None, NULL, 0, &hint); - if ( fullscreen ) vo_decoration( mydisplay,mywindow,0 ); + if ( fullscreen ) vo_x11_decoration( mydisplay,mywindow,0 ); /* Map window. */ @@ -256,8 +256,8 @@ /* catch window resizes */ XSelectInput(mydisplay, mywindow, StructureNotifyMask | KeyPressMask); // XSelectInput(mydisplay, mywindow, StructureNotifyMask); - win_width = image_width; - win_height = image_height; + vo_dwidth = image_width; + vo_dheight = image_height; // resize: XMoveResizeWindow(mydisplay,mywindow,0,0,d_width,d_height); @@ -299,56 +299,20 @@ return; } -#if 0 -static void -check_events(void) +static void check_events(void) { - Window root; - XEvent event; - int x, y; - unsigned int w, h, b, d; + int e=vo_x11_check_events(mydisplay); - if (XCheckWindowEvent(mydisplay, mywindow, StructureNotifyMask, &event)) - { - XGetGeometry(mydisplay, mywindow, &root, &x, &y, &w, &h, &b, &d); - win_width = w; - win_height = h; - } } -#endif static void flip_page(void) { - int i; - XEvent Event; - char buf[100]; - KeySym keySym; - XComposeStatus stat; - unsigned long vo_KeyTable[512]; - - while ( XPending( mydisplay ) ) - { - XNextEvent( mydisplay,&Event ); - switch( Event.type ) - { - case ConfigureNotify: - win_width = Event.xconfigure.width; - win_height = Event.xconfigure.height; - break; - case KeyPress: - XLookupString( &Event.xkey,buf,sizeof(buf),&keySym,&stat ); - vo_keyboard( ( (keySym&0xff00) != 0?( (keySym&0x00ff) + 256 ):( keySym ) ) ); - break; - } - } - -// check_events(); - + check_events(); #ifdef DISP XvShmPutImage(mydisplay, xv_port, mywindow, mygc, xvimage[0], 0, 0, image_width, image_height, - 0, 0, win_width, win_height, + 0, 0, vo_dwidth, vo_dheight, False); XFlush(mydisplay); #endif @@ -407,8 +371,6 @@ { int foo; -// check_events(); - if(xv_format==IMGFMT_YUY2){ // YUY2 packed, flipped #if 0 @@ -450,7 +412,6 @@ static void uninit(void) { -vo_kill_eventhandler(); }