X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fvideo_output%2Fx11%2Fxcommon.c;h=25fc2f9c302f27df932f55c05844e229e1511273;hb=0d0f59ac637b318caf578652ea006ce193f7c581;hp=9874bcd8692f28c279f6b11fe276dfdf3fcdebd3;hpb=b55763db1328128715cdb9a4ce8063f7d3a8f2b4;p=vlc diff --git a/modules/video_output/x11/xcommon.c b/modules/video_output/x11/xcommon.c index 9874bcd869..25fc2f9c30 100644 --- a/modules/video_output/x11/xcommon.c +++ b/modules/video_output/x11/xcommon.c @@ -27,6 +27,10 @@ /***************************************************************************** * Preamble *****************************************************************************/ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + #include #include #include @@ -111,11 +115,16 @@ static void DestroyWindow ( vout_thread_t *, x11_window_t * ); static int NewPicture ( vout_thread_t *, picture_t * ); static void FreePicture ( vout_thread_t *, picture_t * ); +#ifndef MODULE_NAME_IS_glx static IMAGE_TYPE *CreateImage ( vout_thread_t *, Display *, EXTRA_ARGS, int, int ); +#endif + #ifdef HAVE_SYS_SHM_H +#ifndef MODULE_NAME_IS_glx static IMAGE_TYPE *CreateShmImage ( vout_thread_t *, Display *, EXTRA_ARGS_SHM, int, int ); +#endif static int i_shm_major = 0; #endif @@ -499,7 +508,7 @@ void E_(Deactivate) ( vlc_object_t *p_this ) #ifdef HAVE_XSP DisablePixelDoubling(p_vout); #endif - + DestroyCursor( p_vout ); EnableXScreenSaver( p_vout ); DestroyWindow( p_vout, &p_vout->p_sys->original_window ); @@ -1609,8 +1618,7 @@ static int CreateWindow( vout_thread_t *p_vout, x11_window_t *p_win ) if( !p_vout->b_fullscreen ) { - p_win->owner_window = - (Window)vout_RequestWindow( p_vout, &p_win->i_x, &p_win->i_y, + p_win->owner_window = (Window)vout_RequestWindow( p_vout, &p_win->i_x, &p_win->i_y, &p_win->i_width, &p_win->i_height ); xsize_hints.base_width = xsize_hints.width = p_win->i_width; @@ -1673,12 +1681,14 @@ static int CreateWindow( vout_thread_t *p_vout, x11_window_t *p_win ) if( !p_vout->b_fullscreen ) { + const char *argv[] = { "vlc", NULL }; + /* Set window manager hints and properties: size hints, command, * window's name, and accepted protocols */ XSetWMNormalHints( p_vout->p_sys->p_display, p_win->base_window, &xsize_hints ); XSetCommand( p_vout->p_sys->p_display, p_win->base_window, - p_vout->p_libvlc->ppsz_argv, p_vout->p_libvlc->i_argc ); + (char**)argv, 1 ); if( !var_GetBool( p_vout, "video-deco") ) { @@ -1966,7 +1976,7 @@ static int NewPicture( vout_thread_t *p_vout, picture_t *p_pic ) for( i_plane = 0; i_plane < p_pic->p_sys->p_image->num_planes; i_plane++ ) { - p_pic->p[i_plane].p_pixels = p_pic->p_sys->p_image->data + p_pic->p[i_plane].p_pixels = (uint8_t*)p_pic->p_sys->p_image->data + p_pic->p_sys->p_image->offsets[i_plane]; p_pic->p[i_plane].i_pitch = p_pic->p_sys->p_image->pitches[i_plane]; @@ -1975,9 +1985,9 @@ static int NewPicture( vout_thread_t *p_vout, picture_t *p_pic ) { /* U and V inverted compared to I420 * Fixme: this should be handled by the vout core */ - p_pic->U_PIXELS = p_pic->p_sys->p_image->data + p_pic->U_PIXELS = (uint8_t*)p_pic->p_sys->p_image->data + p_pic->p_sys->p_image->offsets[2]; - p_pic->V_PIXELS = p_pic->p_sys->p_image->data + p_pic->V_PIXELS = (uint8_t*)p_pic->p_sys->p_image->data + p_pic->p_sys->p_image->offsets[1]; } break; @@ -1991,7 +2001,7 @@ static int NewPicture( vout_thread_t *p_vout, picture_t *p_pic ) p_pic->p->i_lines = p_pic->p_sys->p_image->height; p_pic->p->i_visible_lines = p_pic->p_sys->p_image->height; - p_pic->p->p_pixels = p_pic->p_sys->p_image->data + p_pic->p->p_pixels = (uint8_t*)p_pic->p_sys->p_image->data + p_pic->p_sys->p_image->xoffset; p_pic->p->i_pitch = p_pic->p_sys->p_image->bytes_per_line; @@ -2011,6 +2021,9 @@ static int NewPicture( vout_thread_t *p_vout, picture_t *p_pic ) p_pic->i_planes = 0; return -1; } +#else + + VLC_UNUSED(p_vout); VLC_UNUSED(p_pic); #endif /* !MODULE_NAME_IS_glx */ @@ -2248,7 +2261,28 @@ static void ToggleFullScreen ( vout_thread_t *p_vout ) #ifdef HAVE_XSP EnablePixelDoubling( p_vout ); #endif - + + /* Activate the window (give it the focus) */ + XClientMessageEvent event; + + memset( &event, 0, sizeof( XClientMessageEvent ) ); + + event.type = ClientMessage; + event.message_type = + XInternAtom( p_vout->p_sys->p_display, "_NET_ACTIVE_WINDOW", False ); + event.display = p_vout->p_sys->p_display; + event.window = p_vout->p_sys->p_win->base_window; + event.format = 32; + event.data.l[ 0 ] = 1; /* source indication (1 = from an application */ + event.data.l[ 1 ] = 0; /* timestamp */ + event.data.l[ 2 ] = 0; /* requestor's currently active window */ + /* XXX: window manager would be more likely to obey if we already have + * an active window (and give it to the event), such as an interface */ + + XSendEvent( p_vout->p_sys->p_display, + DefaultRootWindow( p_vout->p_sys->p_display ), + False, SubstructureRedirectMask, + (XEvent*)&event ); } else { @@ -2633,9 +2667,6 @@ static int InitDisplay( vout_thread_t *p_vout ) if( config_GetInt( p_vout, MODULE_STRING "-shm" ) ) { -# ifdef __APPLE__ - /* FIXME: As of 2001-03-16, XFree4 for MacOS X does not support Xshm */ -# else int major, evt, err; if( XQueryExtension( p_vout->p_sys->p_display, "MIT-SHM", &major, @@ -2655,22 +2686,11 @@ static int InitDisplay( vout_thread_t *p_vout ) major, minor, pixmaps ? "" : "out", p_vout->p_sys->i_shm_opcode ); } - -# endif - - if( !p_vout->p_sys->i_shm_opcode ) - { - msg_Warn( p_vout, "XShm video extension is unavailable" ); - } + else + msg_Warn( p_vout, "XShm video extension not available" ); } else - { - msg_Dbg( p_vout, "disabling XShm video extension" ); - } - -#else - msg_Warn( p_vout, "XShm video extension is unavailable" ); - + msg_Dbg( p_vout, "XShm video extension disabled" ); #endif #ifdef MODULE_NAME_IS_xvideo @@ -2775,6 +2795,8 @@ static int InitDisplay( vout_thread_t *p_vout ) return VLC_SUCCESS; } +#ifndef MODULE_NAME_IS_glx + #ifdef HAVE_SYS_SHM_H /***************************************************************************** * CreateShmImage: create an XImage or XvImage using shared memory extension @@ -2934,6 +2956,7 @@ static IMAGE_TYPE * CreateImage( vout_thread_t *p_vout, return p_image; } +#endif /***************************************************************************** * X11ErrorHandler: replace error handler so we can intercept some of them *****************************************************************************/ @@ -2955,8 +2978,10 @@ static int X11ErrorHandler( Display * display, XErrorEvent * event ) return 0; } +#ifdef HAVE_SYS_SHM_H if( event->request_code == i_shm_major ) /* MIT-SHM */ return i_shm_major = 0; +#endif XSetErrorHandler(NULL); return (XSetErrorHandler(X11ErrorHandler))( display, event ); @@ -3109,10 +3134,11 @@ static void TestNetWMSupport( vout_thread_t *p_vout ) p_args.p_atom = NULL; - p_vout->p_sys->b_net_wm_state_fullscreen = VLC_FALSE; - p_vout->p_sys->b_net_wm_state_above = VLC_FALSE; - p_vout->p_sys->b_net_wm_state_below = VLC_FALSE; - p_vout->p_sys->b_net_wm_state_stays_on_top = VLC_FALSE; + p_vout->p_sys->b_net_wm_state_fullscreen = + p_vout->p_sys->b_net_wm_state_above = + p_vout->p_sys->b_net_wm_state_below = + p_vout->p_sys->b_net_wm_state_stays_on_top = + VLC_FALSE; net_wm_supported = XInternAtom( p_vout->p_sys->p_display, "_NET_SUPPORTED", False );