Thomas Guillem pushed to branch master at VideoLAN / VLC
WARNING: The push did not contain any new commits, but force pushed to delete the commits and changes below. Deleted commits: de2518b1 by Rémi Denis-Courmont at 2021-11-30T22:00:37+02:00 display: remove unnecessary #include - - - - - 2ddcadde by Rémi Denis-Courmont at 2021-11-30T22:00:37+02:00 window: split generic and vout-specific code - - - - - 6 changed files: - src/Makefile.am - src/video_output/display.c - src/video_output/video_output.c - + src/video_output/video_window.c - src/video_output/window.h → src/video_output/video_window.h - src/video_output/window.c Changes: ===================================== src/Makefile.am ===================================== @@ -329,8 +329,9 @@ libvlccore_la_SOURCES = \ video_output/vout_subpictures.c \ video_output/vout_spuregion_helper.h \ video_output/vout_wrapper.h \ + video_output/video_window.c \ + video_output/video_window.h \ video_output/window.c \ - video_output/window.h \ video_output/opengl.c \ video_output/vout_intf.c \ video_output/vout_internal.h \ ===================================== src/video_output/display.c ===================================== @@ -41,7 +41,6 @@ #include <libvlc.h> #include "display.h" -#include "window.h" #include "vout_internal.h" /***************************************************************************** ===================================== src/video_output/video_output.c ===================================== @@ -55,7 +55,7 @@ #include "vout_internal.h" #include "display.h" #include "snapshot.h" -#include "window.h" +#include "video_window.h" #include "../misc/variables.h" #include "../clock/clock.h" #include "statistic.h" ===================================== src/video_output/video_window.c ===================================== @@ -0,0 +1,242 @@ +/***************************************************************************** + * video_window.c: vout-specific window management + ***************************************************************************** + * Copyright © 2014-2021 Rémi Denis-Courmont + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This program 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif +#include <assert.h> +#include <stdlib.h> + +#include <vlc_common.h> +#include <vlc_vout_window.h> +#include <vlc_vout.h> +#include <vlc_vout_display.h> +#include "video_window.h" +#include "vout_internal.h" + +#define DOUBLE_CLICK_TIME VLC_TICK_FROM_MS(300) + +struct vout_window_ack_data { + vout_window_t *window; + vout_window_ack_cb callback; + unsigned width; + unsigned height; + void *opaque; +}; + +static void vout_window_Ack(void *data) +{ + struct vout_window_ack_data *cb_data = data; + + if (cb_data->callback != NULL) + cb_data->callback(cb_data->window, cb_data->width, cb_data->height, + cb_data->opaque); +} + +typedef struct vout_display_window +{ + vout_thread_t *vout; + vlc_mouse_t mouse; + vlc_tick_t last_left_press; +} vout_display_window_t; + +static void vout_display_window_ResizeNotify(vout_window_t *window, + unsigned width, unsigned height, + vout_window_ack_cb cb, + void *opaque) +{ + vout_display_window_t *state = window->owner.sys; + vout_thread_t *vout = state->vout; + struct vout_window_ack_data data = { window, cb, width, height, opaque }; + + msg_Dbg(window, "resized to %ux%u", width, height); + vout_ChangeDisplaySize(vout, width, height, vout_window_Ack, &data); +} + +static void vout_display_window_CloseNotify(vout_window_t *window) +{ + /* TODO: Nowhere to dispatch to currently. + * Needs callback to ES output to deselect ES? */ + msg_Err(window, "window closed"); +} + +static void vout_display_window_StateNotify(vout_window_t *window, + unsigned window_state) +{ + vout_display_window_t *state = window->owner.sys; + vout_thread_t *vout = state->vout; + + static const char states[][8] = { + [VOUT_WINDOW_STATE_NORMAL] = "normal", + [VOUT_WINDOW_STATE_ABOVE] = "above", + [VOUT_WINDOW_STATE_BELOW] = "below", + }; + + assert(window_state < ARRAY_SIZE(states)); + msg_Dbg(window, "window state changed: %s", states[window_state]); + var_SetInteger(vout, "window-state", window_state); +} + +static void vout_display_window_FullscreenNotify(vout_window_t *window, + const char *id) +{ + vout_display_window_t *state = window->owner.sys; + vout_thread_t *vout = state->vout; + + msg_Dbg(window, (id != NULL) ? "window set to fullscreen on %s" + : "window set to fullscreen", id); + var_SetString(vout, "window-fullscreen-output", + (id != NULL) ? id : ""); + var_SetBool(vout, "window-fullscreen", true); +} + +static void vout_display_window_WindowingNotify(vout_window_t *window) +{ + vout_display_window_t *state = window->owner.sys; + vout_thread_t *vout = state->vout; + + msg_Dbg(window, "window set windowed"); + var_SetBool(vout, "window-fullscreen", false); +} + +static void vout_display_window_MouseEvent(vout_window_t *window, + const vout_window_mouse_event_t *ev) +{ + vout_display_window_t *state = window->owner.sys; + vout_thread_t *vout = state->vout; + vlc_mouse_t *m = &state->mouse; + + m->b_double_click = false; + + switch (ev->type) + { + case VOUT_WINDOW_MOUSE_MOVED: + vlc_mouse_SetPosition(m, ev->x, ev->y); + state->last_left_press = INT64_MIN; + break; + + case VOUT_WINDOW_MOUSE_PRESSED: + if (!window->info.has_double_click + && ev->button_mask == MOUSE_BUTTON_LEFT + && !vlc_mouse_IsLeftPressed(m)) + { + const vlc_tick_t now = vlc_tick_now(); + + if (state->last_left_press != INT64_MIN + && now - state->last_left_press < DOUBLE_CLICK_TIME) + { + m->b_double_click = true; + state->last_left_press = INT64_MIN; + } + else + state->last_left_press = now; + } + + vlc_mouse_SetPressed(m, ev->button_mask); + break; + + case VOUT_WINDOW_MOUSE_RELEASED: + vlc_mouse_SetReleased(m, ev->button_mask); + break; + + case VOUT_WINDOW_MOUSE_DOUBLE_CLICK: + assert(window->info.has_double_click); + m->b_double_click = true; + break; + + default: + vlc_assert_unreachable(); + } + + vout_MouseState(vout, m); +} + +static void vout_display_window_KeyboardEvent(vout_window_t *window, + unsigned key) +{ + var_SetInteger(vlc_object_instance(window), "key-pressed", key); +} + +static void vout_display_window_OutputEvent(vout_window_t *window, + const char *name, const char *desc) +{ + if (desc != NULL) + msg_Dbg(window, "fullscreen output %s (%s) added", name, desc); + else + msg_Dbg(window, "fullscreen output %s removed", name); +} + +static const struct vout_window_callbacks vout_display_window_cbs = { + .resized = vout_display_window_ResizeNotify, + .closed = vout_display_window_CloseNotify, + .state_changed = vout_display_window_StateNotify, + .fullscreened = vout_display_window_FullscreenNotify, + .windowed = vout_display_window_WindowingNotify, + .mouse_event = vout_display_window_MouseEvent, + .keyboard_event = vout_display_window_KeyboardEvent, + .output_event = vout_display_window_OutputEvent, +}; + +/** + * Creates a video window, initially without any attached display. + */ +vout_window_t *vout_display_window_New(vout_thread_t *vout) +{ + vout_display_window_t *state = malloc(sizeof (*state)); + if (state == NULL) + return NULL; + + vlc_mouse_Init(&state->mouse); + state->last_left_press = INT64_MIN; + state->vout = vout; + + char *modlist = var_InheritString(vout, "window"); + vout_window_owner_t owner = { + .cbs = &vout_display_window_cbs, + .sys = state, + }; + vout_window_t *window; + + var_Create(vout, "window-state", VLC_VAR_INTEGER); + var_Create(vout, "window-fullscreen", VLC_VAR_BOOL); + var_Create(vout, "window-fullscreen-output", VLC_VAR_STRING); + + window = vout_window_New((vlc_object_t *)vout, modlist, &owner); + free(modlist); + if (window == NULL) + free(state); + return window; +} + +/** + * Destroys a video window. + * \note The window must be detached. + */ +void vout_display_window_Delete(vout_window_t *window) +{ + vout_display_window_t *state = window->owner.sys; + vout_thread_t *vout = state->vout; + + vout_window_Delete(window); + var_Destroy(vout, "window-fullscreen-output"); + var_Destroy(vout, "window-fullscreen"); + var_Destroy(vout, "window-state"); + free(state); +} ===================================== src/video_output/window.h → src/video_output/video_window.h ===================================== @@ -1,5 +1,5 @@ /***************************************************************************** - * window.h: window management for VLC video output + * video_window.h: window management for VLC video output ***************************************************************************** * Copyright © 2014 Rémi Denis-Courmont * ===================================== src/video_output/window.c ===================================== @@ -1,7 +1,8 @@ /***************************************************************************** - * window.c: "vout window" management + * window.c: generic window management ***************************************************************************** * Copyright (C) 2009 Laurent Aimar + * Copyright © 2009-2021 Rémi Denis-Courmont * * Authors: Laurent Aimar <fenrir _AT_ videolan _DOT_ org> * @@ -197,219 +198,3 @@ void vout_window_ReportFullscreen(vout_window_t *window, const char *id) if (window->owner.cbs->fullscreened != NULL) window->owner.cbs->fullscreened(window, id); } - -struct vout_window_ack_data { - vout_window_t *window; - vout_window_ack_cb callback; - unsigned width; - unsigned height; - void *opaque; -}; - -static void vout_window_Ack(void *data) -{ - struct vout_window_ack_data *cb_data = data; - - if (cb_data->callback != NULL) - cb_data->callback(cb_data->window, cb_data->width, cb_data->height, - cb_data->opaque); -} - -/* Video output display integration */ -#include <vlc_vout.h> -#include <vlc_vout_display.h> -#include "window.h" -#include "vout_internal.h" - -#define DOUBLE_CLICK_TIME VLC_TICK_FROM_MS(300) - -typedef struct vout_display_window -{ - vout_thread_t *vout; - vlc_mouse_t mouse; - vlc_tick_t last_left_press; -} vout_display_window_t; - -static void vout_display_window_ResizeNotify(vout_window_t *window, - unsigned width, unsigned height, - vout_window_ack_cb cb, - void *opaque) -{ - vout_display_window_t *state = window->owner.sys; - vout_thread_t *vout = state->vout; - struct vout_window_ack_data data = { window, cb, width, height, opaque }; - - msg_Dbg(window, "resized to %ux%u", width, height); - vout_ChangeDisplaySize(vout, width, height, vout_window_Ack, &data); -} - -static void vout_display_window_CloseNotify(vout_window_t *window) -{ - /* TODO: Nowhere to dispatch to currently. - * Needs callback to ES output to deselect ES? */ - msg_Err(window, "window closed"); -} - -static void vout_display_window_StateNotify(vout_window_t *window, - unsigned window_state) -{ - vout_display_window_t *state = window->owner.sys; - vout_thread_t *vout = state->vout; - - static const char states[][8] = { - [VOUT_WINDOW_STATE_NORMAL] = "normal", - [VOUT_WINDOW_STATE_ABOVE] = "above", - [VOUT_WINDOW_STATE_BELOW] = "below", - }; - - assert(window_state < ARRAY_SIZE(states)); - msg_Dbg(window, "window state changed: %s", states[window_state]); - var_SetInteger(vout, "window-state", window_state); -} - -static void vout_display_window_FullscreenNotify(vout_window_t *window, - const char *id) -{ - vout_display_window_t *state = window->owner.sys; - vout_thread_t *vout = state->vout; - - msg_Dbg(window, (id != NULL) ? "window set to fullscreen on %s" - : "window set to fullscreen", id); - var_SetString(vout, "window-fullscreen-output", - (id != NULL) ? id : ""); - var_SetBool(vout, "window-fullscreen", true); -} - -static void vout_display_window_WindowingNotify(vout_window_t *window) -{ - vout_display_window_t *state = window->owner.sys; - vout_thread_t *vout = state->vout; - - msg_Dbg(window, "window set windowed"); - var_SetBool(vout, "window-fullscreen", false); -} - -static void vout_display_window_MouseEvent(vout_window_t *window, - const vout_window_mouse_event_t *ev) -{ - vout_display_window_t *state = window->owner.sys; - vout_thread_t *vout = state->vout; - vlc_mouse_t *m = &state->mouse; - - m->b_double_click = false; - - switch (ev->type) - { - case VOUT_WINDOW_MOUSE_MOVED: - vlc_mouse_SetPosition(m, ev->x, ev->y); - state->last_left_press = INT64_MIN; - break; - - case VOUT_WINDOW_MOUSE_PRESSED: - if (!window->info.has_double_click - && ev->button_mask == MOUSE_BUTTON_LEFT - && !vlc_mouse_IsLeftPressed(m)) - { - const vlc_tick_t now = vlc_tick_now(); - - if (state->last_left_press != INT64_MIN - && now - state->last_left_press < DOUBLE_CLICK_TIME) - { - m->b_double_click = true; - state->last_left_press = INT64_MIN; - } - else - state->last_left_press = now; - } - - vlc_mouse_SetPressed(m, ev->button_mask); - break; - - case VOUT_WINDOW_MOUSE_RELEASED: - vlc_mouse_SetReleased(m, ev->button_mask); - break; - - case VOUT_WINDOW_MOUSE_DOUBLE_CLICK: - assert(window->info.has_double_click); - m->b_double_click = true; - break; - - default: - vlc_assert_unreachable(); - } - - vout_MouseState(vout, m); -} - -static void vout_display_window_KeyboardEvent(vout_window_t *window, - unsigned key) -{ - var_SetInteger(vlc_object_instance(window), "key-pressed", key); -} - -static void vout_display_window_OutputEvent(vout_window_t *window, - const char *name, const char *desc) -{ - if (desc != NULL) - msg_Dbg(window, "fullscreen output %s (%s) added", name, desc); - else - msg_Dbg(window, "fullscreen output %s removed", name); -} - -static const struct vout_window_callbacks vout_display_window_cbs = { - .resized = vout_display_window_ResizeNotify, - .closed = vout_display_window_CloseNotify, - .state_changed = vout_display_window_StateNotify, - .fullscreened = vout_display_window_FullscreenNotify, - .windowed = vout_display_window_WindowingNotify, - .mouse_event = vout_display_window_MouseEvent, - .keyboard_event = vout_display_window_KeyboardEvent, - .output_event = vout_display_window_OutputEvent, -}; - -/** - * Creates a video window, initially without any attached display. - */ -vout_window_t *vout_display_window_New(vout_thread_t *vout) -{ - vout_display_window_t *state = malloc(sizeof (*state)); - if (state == NULL) - return NULL; - - vlc_mouse_Init(&state->mouse); - state->last_left_press = INT64_MIN; - state->vout = vout; - - char *modlist = var_InheritString(vout, "window"); - vout_window_owner_t owner = { - .cbs = &vout_display_window_cbs, - .sys = state, - }; - vout_window_t *window; - - var_Create(vout, "window-state", VLC_VAR_INTEGER); - var_Create(vout, "window-fullscreen", VLC_VAR_BOOL); - var_Create(vout, "window-fullscreen-output", VLC_VAR_STRING); - - window = vout_window_New((vlc_object_t *)vout, modlist, &owner); - free(modlist); - if (window == NULL) - free(state); - return window; -} - -/** - * Destroys a video window. - * \note The window must be detached. - */ -void vout_display_window_Delete(vout_window_t *window) -{ - vout_display_window_t *state = window->owner.sys; - vout_thread_t *vout = state->vout; - - vout_window_Delete(window); - var_Destroy(vout, "window-fullscreen-output"); - var_Destroy(vout, "window-fullscreen"); - var_Destroy(vout, "window-state"); - free(state); -} View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/76b3ad36d3e6d9a6f38b2d17b6054b50760e6aed...2ddcadde698efaab7986912cba514d81c2ecb6b6 -- View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/76b3ad36d3e6d9a6f38b2d17b6054b50760e6aed...2ddcadde698efaab7986912cba514d81c2ecb6b6 You're receiving this email because of your account on code.videolan.org.
_______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits