vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Sun Dec 30 20:40:37 2018 +0200| [9e1021fba1c6ac0da5851ec4244b0f65f45435f0] | committer: Rémi Denis-Courmont
display: add/use vout_display_TranslateMouseState() > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=9e1021fba1c6ac0da5851ec4244b0f65f45435f0 --- include/vlc_vout_display.h | 9 +++++++++ src/video_output/display.c | 23 +++++++++++++++++++++++ src/video_output/video_output.c | 17 +---------------- 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/include/vlc_vout_display.h b/include/vlc_vout_display.h index c740f210c0..c0d44dd33d 100644 --- a/include/vlc_vout_display.h +++ b/include/vlc_vout_display.h @@ -416,6 +416,15 @@ typedef struct { */ VLC_API void vout_display_PlacePicture(vout_display_place_t *place, const video_format_t *source, const vout_display_cfg_t *cfg); +/** + * Translates mouse state. + * + * This translates the mouse (pointer) state from window coordinates to + * video coordinates. + * @note @c video and @c window pointers may alias. + */ +void vout_display_TranslateMouseState(vout_display_t *vd, vlc_mouse_t *video, + const vlc_mouse_t *window); /** * Helper function that applies the necessary transforms to the mouse position diff --git a/src/video_output/display.c b/src/video_output/display.c index c68dcda0fb..093889f61a 100644 --- a/src/video_output/display.c +++ b/src/video_output/display.c @@ -223,6 +223,29 @@ void vout_display_PlacePicture(vout_display_place_t *place, } } +void vout_display_TranslateMouseState(vout_display_t *vd, vlc_mouse_t *video, + const vlc_mouse_t *window) +{ + vout_display_place_t place; + + /* Translate window coordinates to video coordinates */ + vout_display_PlacePicture(&place, &vd->source, vd->cfg); + + if (place.width <= 0 || place.height <= 0) { + memset(video, 0, sizeof (*video)); + return; + } + + video->i_x = vd->source.i_x_offset + + (int64_t)(window->i_x - place.x) + * vd->source.i_visible_width / place.width; + video->i_y = vd->source.i_y_offset + + (int64_t)(window->i_y - place.y) + * vd->source.i_visible_height / place.height; + video->i_pressed = window->i_pressed; + video->b_double_click = window->b_double_click; +} + void vout_display_SendMouseMovedDisplayCoordinates(vout_display_t *vd, video_orientation_t orient_display, int m_x, int m_y, vout_display_place_t *place) { video_format_t source_rot = vd->source; diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c index 393d3705f2..4393cf99da 100644 --- a/src/video_output/video_output.c +++ b/src/video_output/video_output.c @@ -1347,25 +1347,10 @@ static void ThreadStep(vout_thread_t *vout, vlc_tick_t *duration) static void ThreadTranslateMouseState(vout_thread_t *vout, const vlc_mouse_t *win_mouse) { - vout_display_t *vd = vout->p->display; vlc_mouse_t vid_mouse; - vout_display_place_t place; /* Translate window coordinates to video coordinates */ - vout_display_PlacePicture(&place, &vd->source, vd->cfg); - - if (place.width <= 0 || place.height <= 0) - return; - - const int x = vd->source.i_x_offset - + (int64_t)(win_mouse->i_x - place.x) - * vd->source.i_visible_width / place.width; - const int y = vd->source.i_y_offset - + (int64_t)(win_mouse->i_y - place.y) - * vd->source.i_visible_height / place.height; - - vid_mouse = *win_mouse; - vlc_mouse_SetPosition(&vid_mouse, x, y); + vout_display_TranslateMouseState(vout->p->display, &vid_mouse, win_mouse); /* Then pass up the filter chains. */ vout_SendDisplayEventMouse(vout, &vid_mouse); _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
