📄 xcommon.c
字号:
p_vout->p_sys->p_win->base_window, DefaultRootWindow( p_vout->p_sys->p_display ), 0, 0 ); } if( p_vout->p_sys->b_net_wm_state_fullscreen ) { XClientMessageEvent event; memset( &event, 0, sizeof( XClientMessageEvent ) ); event.type = ClientMessage; event.message_type = p_vout->p_sys->net_wm_state; 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; /* set property */ event.data.l[ 1 ] = p_vout->p_sys->net_wm_state_fullscreen; XSendEvent( p_vout->p_sys->p_display, DefaultRootWindow( p_vout->p_sys->p_display ), False, SubstructureRedirectMask, (XEvent*)&event ); } /* Make sure the change is effective */ XReparentWindow( p_vout->p_sys->p_display, p_vout->p_sys->p_win->base_window, DefaultRootWindow( p_vout->p_sys->p_display ), 0, 0 );#ifdef HAVE_XINERAMA if( XineramaQueryExtension( p_vout->p_sys->p_display, &i_d1, &i_d2 ) && XineramaIsActive( p_vout->p_sys->p_display ) ) { XineramaScreenInfo *screens; /* infos for xinerama */ int i_num_screens; msg_Dbg( p_vout, "using XFree Xinerama extension");#define SCREEN p_vout->p_sys->p_win->i_screen /* Get Information about Xinerama (num of screens) */ screens = XineramaQueryScreens( p_vout->p_sys->p_display, &i_num_screens ); if( !SCREEN ) SCREEN = config_GetInt( p_vout, MODULE_STRING "-xineramascreen" ); /* just check that user has entered a good value */ if( SCREEN >= i_num_screens || SCREEN < 0 ) { msg_Dbg( p_vout, "requested screen number invalid" ); SCREEN = 0; } /* Get the X/Y upper left corner coordinate of the above screen */ p_vout->p_sys->p_win->i_x = screens[SCREEN].x_org; p_vout->p_sys->p_win->i_y = screens[SCREEN].y_org; /* Set the Height/width to the screen resolution */ p_vout->p_sys->p_win->i_width = screens[SCREEN].width; p_vout->p_sys->p_win->i_height = screens[SCREEN].height; XFree(screens);#undef SCREEN } else#endif { /* The window wasn't necessarily created at the requested size */ p_vout->p_sys->p_win->i_x = p_vout->p_sys->p_win->i_y = 0; p_vout->p_sys->p_win->i_width = DisplayWidth( p_vout->p_sys->p_display, p_vout->p_sys->i_screen ); p_vout->p_sys->p_win->i_height = DisplayHeight( p_vout->p_sys->p_display, p_vout->p_sys->i_screen ); } XMoveResizeWindow( p_vout->p_sys->p_display, p_vout->p_sys->p_win->base_window, p_vout->p_sys->p_win->i_x, p_vout->p_sys->p_win->i_y, p_vout->p_sys->p_win->i_width, p_vout->p_sys->p_win->i_height ); } else { msg_Dbg( p_vout, "leaving fullscreen mode" ); XReparentWindow( p_vout->p_sys->p_display, p_vout->p_sys->original_window.video_window, p_vout->p_sys->original_window.base_window, 0, 0 ); p_vout->p_sys->fullscreen_window.video_window = None; DestroyWindow( p_vout, &p_vout->p_sys->fullscreen_window ); p_vout->p_sys->p_win = &p_vout->p_sys->original_window; XMapWindow( p_vout->p_sys->p_display, p_vout->p_sys->p_win->base_window ); } /* Unfortunately, using XSync() here is not enough to ensure the * window has already been mapped because the XMapWindow() request * has not necessarily been sent directly to our window (remember, * the call is first redirected to the window manager) */ do { XWindowEvent( p_vout->p_sys->p_display, p_vout->p_sys->p_win->base_window, StructureNotifyMask, &xevent ); } while( xevent.type != MapNotify ); /* Be careful, this can generate a BadMatch error if the window is not * already mapped by the server (see above) */ XSetInputFocus(p_vout->p_sys->p_display, p_vout->p_sys->p_win->base_window, RevertToParent, CurrentTime); /* signal that the size needs to be updated */ p_vout->i_changes |= VOUT_SIZE_CHANGE;}/***************************************************************************** * EnableXScreenSaver: enable screen saver ***************************************************************************** * This function enables the screen saver on a display after it has been * disabled by XDisableScreenSaver. * FIXME: what happens if multiple vlc sessions are running at the same * time ??? *****************************************************************************/static void EnableXScreenSaver( vout_thread_t *p_vout ){#ifdef DPMSINFO_IN_DPMS_H int dummy;#endif if( p_vout->p_sys->i_ss_timeout ) { XSetScreenSaver( p_vout->p_sys->p_display, p_vout->p_sys->i_ss_timeout, p_vout->p_sys->i_ss_interval, p_vout->p_sys->i_ss_blanking, p_vout->p_sys->i_ss_exposure ); } /* Restore DPMS settings */#ifdef DPMSINFO_IN_DPMS_H if( DPMSQueryExtension( p_vout->p_sys->p_display, &dummy, &dummy ) ) { if( p_vout->p_sys->b_ss_dpms ) { DPMSEnable( p_vout->p_sys->p_display ); } }#endif}/***************************************************************************** * DisableXScreenSaver: disable screen saver ***************************************************************************** * See XEnableXScreenSaver *****************************************************************************/static void DisableXScreenSaver( vout_thread_t *p_vout ){#ifdef DPMSINFO_IN_DPMS_H int dummy;#endif /* Save screen saver information */ XGetScreenSaver( p_vout->p_sys->p_display, &p_vout->p_sys->i_ss_timeout, &p_vout->p_sys->i_ss_interval, &p_vout->p_sys->i_ss_blanking, &p_vout->p_sys->i_ss_exposure ); /* Disable screen saver */ if( p_vout->p_sys->i_ss_timeout ) { XSetScreenSaver( p_vout->p_sys->p_display, 0, p_vout->p_sys->i_ss_interval, p_vout->p_sys->i_ss_blanking, p_vout->p_sys->i_ss_exposure ); } /* Disable DPMS */#ifdef DPMSINFO_IN_DPMS_H if( DPMSQueryExtension( p_vout->p_sys->p_display, &dummy, &dummy ) ) { CARD16 unused; /* Save DPMS current state */ DPMSInfo( p_vout->p_sys->p_display, &unused, &p_vout->p_sys->b_ss_dpms ); DPMSDisable( p_vout->p_sys->p_display ); }#endif}/***************************************************************************** * CreateCursor: create a blank mouse pointer *****************************************************************************/static void CreateCursor( vout_thread_t *p_vout ){ XColor cursor_color; p_vout->p_sys->cursor_pixmap = XCreatePixmap( p_vout->p_sys->p_display, DefaultRootWindow( p_vout->p_sys->p_display ), 1, 1, 1 ); XParseColor( p_vout->p_sys->p_display, XCreateColormap( p_vout->p_sys->p_display, DefaultRootWindow( p_vout->p_sys->p_display ), DefaultVisual( p_vout->p_sys->p_display, p_vout->p_sys->i_screen ), AllocNone ), "black", &cursor_color ); p_vout->p_sys->blank_cursor = XCreatePixmapCursor( p_vout->p_sys->p_display, p_vout->p_sys->cursor_pixmap, p_vout->p_sys->cursor_pixmap, &cursor_color, &cursor_color, 1, 1 );}/***************************************************************************** * DestroyCursor: destroy the blank mouse pointer *****************************************************************************/static void DestroyCursor( vout_thread_t *p_vout ){ XFreePixmap( p_vout->p_sys->p_display, p_vout->p_sys->cursor_pixmap );}/***************************************************************************** * ToggleCursor: hide or show the mouse pointer ***************************************************************************** * This function hides the X pointer if it is visible by setting the pointer * sprite to a blank one. To show it again, we disable the sprite. *****************************************************************************/static void ToggleCursor( vout_thread_t *p_vout ){ if( p_vout->p_sys->b_mouse_pointer_visible ) { XDefineCursor( p_vout->p_sys->p_display, p_vout->p_sys->p_win->base_window, p_vout->p_sys->blank_cursor ); p_vout->p_sys->b_mouse_pointer_visible = 0; } else { XUndefineCursor( p_vout->p_sys->p_display, p_vout->p_sys->p_win->base_window ); p_vout->p_sys->b_mouse_pointer_visible = 1; }}#ifdef MODULE_NAME_IS_xvideo/***************************************************************************** * XVideoGetPort: get YUV12 port *****************************************************************************/static int XVideoGetPort( vout_thread_t *p_vout, vlc_fourcc_t i_chroma, vlc_fourcc_t *pi_newchroma ){ XvAdaptorInfo *p_adaptor; unsigned int i; int i_adaptor, i_num_adaptors, i_requested_adaptor; int i_selected_port; switch( XvQueryExtension( p_vout->p_sys->p_display, &i, &i, &i, &i, &i ) ) { case Success: break; case XvBadExtension: msg_Warn( p_vout, "XvBadExtension" ); return -1; case XvBadAlloc: msg_Warn( p_vout, "XvBadAlloc" ); return -1; default: msg_Warn( p_vout, "XvQueryExtension failed" ); return -1; } switch( XvQueryAdaptors( p_vout->p_sys->p_display, DefaultRootWindow( p_vout->p_sys->p_display ), &i_num_adaptors, &p_adaptor ) ) { case Success: break; case XvBadExtension: msg_Warn( p_vout, "XvBadExtension for XvQueryAdaptors" ); return -1; case XvBadAlloc: msg_Warn( p_vout, "XvBadAlloc for XvQueryAdaptors" ); return -1; default: msg_Warn( p_vout, "XvQueryAdaptors failed" ); return -1; } i_selected_port = -1; i_requested_adaptor = config_GetInt( p_vout, "xvideo-adaptor" ); for( i_adaptor = 0; i_adaptor < i_num_adaptors; ++i_adaptor ) { XvImageFormatValues *p_formats; int i_format, i_num_formats; int i_port; /* If we requested an adaptor and it's not this one, we aren't * interested */ if( i_requested_adaptor != -1 && i_adaptor != i_requested_adaptor ) { continue; } /* If the adaptor doesn't have the required properties, skip it */ if( !( p_adaptor[ i_adaptor ].type & XvInputMask ) || !( p_adaptor[ i_adaptor ].type & XvImageMask ) ) { continue; } /* Check that adaptor supports our requested format... */ p_formats = XvListImageFormats( p_vout->p_sys->p_display, p_adaptor[i_adaptor].base_id, &i_num_formats ); for( i_format = 0; i_format < i_num_formats && ( i_selected_port == -1 ); i_format++ ) { XvAttribute *p_attr; int i_attr, i_num_attributes; /* If this is not the format we want, or at least a * similar one, forget it */ if( !vout_Chr
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -