From 96973d2db5caddc6f8fc381e9350ec43181f920d Mon Sep 17 00:00:00 2001 From: Antoine Cellerier Date: Mon, 26 May 2008 16:03:33 +0200 Subject: [PATCH] Add --screen-mouse-follow option (x11 only). --- modules/access/screen/screen.c | 13 +++++++++++++ modules/access/screen/screen.h | 6 +++++- modules/access/screen/x11.c | 20 ++++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/modules/access/screen/screen.c b/modules/access/screen/screen.c index 2f2fe79842..a7d15f5608 100644 --- a/modules/access/screen/screen.c +++ b/modules/access/screen/screen.c @@ -67,6 +67,10 @@ #define HEIGHT_TEXT N_( "Subscreen height" ) #define HEIGHT_LONGTEXT N_( \ "Subscreen height." ) + +#define FOLLOW_MOUSE_TEXT N_( "Follow the mouse" ) +#define FOLLOW_MOUSE_LONGTEXT N_( \ + "Follow the mouse when capturing a subscreen" ) #endif static int Open ( vlc_object_t * ); @@ -93,6 +97,9 @@ vlc_module_begin(); add_integer( "screen-left", 0, NULL, LEFT_TEXT, LEFT_LONGTEXT, true ); add_integer( "screen-width", 0, NULL, WIDTH_TEXT, WIDTH_LONGTEXT, true ); add_integer( "screen-height", 0, NULL, HEIGHT_TEXT, HEIGHT_LONGTEXT, true ); + add_integer( "screen-height", 0, NULL, HEIGHT_TEXT, HEIGHT_LONGTEXT, true ); + add_bool( "screen-follow-mouse", false, NULL, FOLLOW_MOUSE_TEXT, + FOLLOW_MOUSE_LONGTEXT, true ); #endif #ifdef WIN32 @@ -171,8 +178,14 @@ static int Open( vlc_object_t *p_this ) } else { + p_sys->i_screen_width = p_sys->fmt.video.i_width; + p_sys->i_screen_height = p_sys->fmt.video.i_height; p_sys->fmt.video.i_width = p_sys->i_width; p_sys->fmt.video.i_height = p_sys->i_height; + p_sys->b_follow_mouse = var_CreateGetInteger( p_demux, + "screen-follow-mouse" ); + if( p_sys->b_follow_mouse ) + msg_Dbg( p_demux, "mouse following enabled" ); } } #endif diff --git a/modules/access/screen/screen.h b/modules/access/screen/screen.h index 519edc0016..d3b1299625 100644 --- a/modules/access/screen/screen.h +++ b/modules/access/screen/screen.h @@ -41,10 +41,14 @@ struct demux_sys_t int i_incr; #ifdef SCREEN_SUBSCREEN + bool b_follow_mouse; + unsigned int i_screen_height; + unsigned int i_screen_width; + unsigned int i_top; unsigned int i_left; - unsigned int i_width; unsigned int i_height; + unsigned int i_width; #endif screen_data_t *p_data; diff --git a/modules/access/screen/x11.c b/modules/access/screen/x11.c index c3af78db0b..a8cf374945 100644 --- a/modules/access/screen/x11.c +++ b/modules/access/screen/x11.c @@ -113,6 +113,26 @@ block_t *screen_Capture( demux_t *p_demux ) XImage *image; int i_size; + if( p_sys->b_follow_mouse ) + { + Window root = DefaultRootWindow( p_display ), child; + int root_x, root_y; + int win_x, win_y; + unsigned int mask; + if( XQueryPointer( p_display, root, + &root, &child, &root_x, &root_y, &win_x, &win_y, + &mask ) ) + { + p_sys->i_left = __MIN( (unsigned int)root_x, + p_sys->i_screen_width - p_sys->i_width ); + p_sys->i_top = __MIN( (unsigned int)root_y, + p_sys->i_screen_height - p_sys->i_height ); + } + else + msg_Dbg( p_demux, "XQueryPointer() failed" ); + + } + image = XGetImage( p_display, DefaultRootWindow( p_display ), p_sys->i_left, p_sys->i_top, p_sys->fmt.video.i_width, p_sys->fmt.video.i_height, AllPlanes, ZPixmap ); -- 2.20.1