[vlc-devel] [PATCH 4/4] win32: Send fullscreen to specific monitor
Steve Lhomme
robux4 at ycbcr.xyz
Thu Oct 24 13:32:30 CEST 2019
Here's a patch that allows going fullscreen on a given HMONITOR. Thats'
what this patch should use in the end and the logo+shift+arrow patch.
On 2019-10-24 13:17, Steve Lhomme wrote:
> On 2019-10-24 13:14, Steve Lhomme wrote:
>> On 2019-10-24 12:21, Alexandre Janniaux wrote:
>>> When in fullscreen, the window can be moved to another
>>> screen by using logo+shift+arrow key. When doing so on
>>> screens which are not the same size, the window is not
>>> resized and keep the size from the former screen. It should
>>> probably keep the resize state somewhere and resize
>>> adequatly while using vout_window_ReportSize() so that
>>> video outputs can be resized too.
>>>
>>> I don't know if you want to add this to your patch too, as
>>> the behaviour is already present without yours, but maybe
>>> Windows dev here can provide advice for this?
>>
>> I should be able to fix it. We probably need to handle the WM_MOVE
>> and, when in fullscreen, adapt the size of the window if the monitor
>> changed.
>>
>> It's probably better to apply a fix after this change as it would
>> impact how we apply the fullscreen based on the selected monitor. In
>> this case it wouldn't come the core anymore but from the local
>> detection of the monitor. That means the monitor from the core should
>> return just a
>
> the monitor *selection* (based on the screen from the core)
>
>> HMONITOR, which is always what we'll use when we use the one forced by
>> the OS.
>>
>>> PS: just for giving context, I used your patch in a VR demo
>>> so as to force a VR sidebyside output to the HMD screen and
>>> a classic 360° pano output to the main screen.
>>>
>>> On Sat, Oct 12, 2019 at 11:58:31PM -0400, Gabriel Luci wrote:
>>>> This reads the id parameter as the name of the monitor that should be
>>>> used. If anything goes wrong, it will fall back to the monitor the
>>>> window is already on (which is what it always did before).
>>>>
>>>> ---
>>>> modules/video_output/win32/window.c | 72
>>>> +++++++++++++++++++++++++++++++++----
>>>> 1 file changed, 65 insertions(+), 7 deletions(-)
>>>>
>>>> diff --git a/modules/video_output/win32/window.c
>>>> b/modules/video_output/win32/window.c
>>>> index 50e172b9b4..eefaed256e 100644
>>>> --- a/modules/video_output/win32/window.c
>>>> +++ b/modules/video_output/win32/window.c
>>>> @@ -37,6 +37,7 @@
>>>> #include <vlc_actions.h>
>>>>
>>>> #include <shellapi.h> /*
>>>> ExtractIcon */
>>>> +#include <vlc_charset.h> /*
>>>> FromWide */
>>>>
>>>> #define RECTWidth(r) (LONG)((r).right - (r).left)
>>>> #define RECTHeight(r) (LONG)((r).bottom - (r).top)
>>>> @@ -153,9 +154,37 @@ static void SetTitle(vout_window_t *wnd, const
>>>> char *title)
>>>> PostMessage( sys->hwnd, WM_VLC_CHANGE_TEXT, 0, 0 );
>>>> }
>>>>
>>>> +typedef struct enum_monitors_callback_params_t {
>>>> + bool is_monitor_found;
>>>> + const char *psz_name_to_find;
>>>> + MONITORINFOEX *found_monitor_info;
>>>> +} enum_monitors_callback_params_t;
>>>> +
>>>> +static BOOL CALLBACK EnumDisplayMonitorsCallback(HMONITOR hMonitor,
>>>> HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
>>>> +{
>>>> + /* this is called for each active monitor */
>>>> +
>>>> + VLC_UNUSED(hdcMonitor);
>>>> + VLC_UNUSED(lprcMonitor);
>>>> +
>>>> + MONITORINFOEX mi;
>>>> + mi.cbSize = sizeof(MONITORINFOEX);
>>>> + if (!GetMonitorInfo(hMonitor, (LPMONITORINFO) &mi)) return true;
>>>> +
>>>> + enum_monitors_callback_params_t *params =
>>>> (enum_monitors_callback_params_t*) dwData;
>>>> + char *psz_monitor_name = FromWide(mi.szDevice);
>>>> + if (!strcmp(psz_monitor_name, params->psz_name_to_find))
>>>> + {
>>>> + /* the monitor name matches what we're looking for */
>>>> + params->is_monitor_found = true;
>>>> + params->found_monitor_info = &mi;
>>>> + }
>>>> + free(psz_monitor_name);
>>>> + return !params->is_monitor_found;
>>>> +}
>>>> +
>>>> static void SetFullscreen(vout_window_t *wnd, const char *id)
>>>> {
>>>> - VLC_UNUSED(id);
>>>> msg_Dbg(wnd, "entering fullscreen mode");
>>>> vout_window_sys_t *sys = wnd->sys;
>>>>
>>>> @@ -167,12 +196,41 @@ static void SetFullscreen(vout_window_t *wnd,
>>>> const char *id)
>>>> /* Change window style, no borders and no title bar */
>>>> SetWindowLong(sys->hwnd, GWL_STYLE, WS_CLIPCHILDREN |
>>>> WS_VISIBLE);
>>>>
>>>> - /* Retrieve current window position so fullscreen will happen
>>>> - * on the right screen */
>>>> - HMONITOR hmon = MonitorFromWindow(sys->hwnd,
>>>> MONITOR_DEFAULTTONEAREST);
>>>> - MONITORINFO mi;
>>>> - mi.cbSize = sizeof(MONITORINFO);
>>>> - if (GetMonitorInfo(hmon, &mi))
>>>> + /* Figure out which monitor we should be using */
>>>> + MONITORINFOEX mi;
>>>> + bool is_monitor_found = false;
>>>> +
>>>> + if (id)
>>>> + {
>>>> + /* We're being told to use a specific monitor, so see if we
>>>> can find an
>>>> + * active monitor with the same name */
>>>> + enum_monitors_callback_params_t params = {
>>>> + .is_monitor_found = false,
>>>> + .psz_name_to_find = id
>>>> + };
>>>> + EnumDisplayMonitors(NULL, NULL,
>>>> &EnumDisplayMonitorsCallback, (LPARAM) ¶ms);
>>>> +
>>>> + if (params.is_monitor_found)
>>>> + {
>>>> + is_monitor_found = true;
>>>> + mi = *(params.found_monitor_info);
>>>> + }
>>>> + else
>>>> + {
>>>> + msg_Dbg(wnd, "display device with name \"%s\" was
>>>> requested, but no such device exists. Falling back to primary", id);
>>>> + }
>>>> + }
>>>> +
>>>> + if (!is_monitor_found)
>>>> + {
>>>> + /* fall back to using the screen the window is currently
>>>> mostly on */
>>>> + HMONITOR hmon;
>>>> + hmon = MonitorFromWindow(sys->hwnd, MONITOR_DEFAULTTONEAREST);
>>>> + mi.cbSize = sizeof(MONITORINFOEX);
>>>> + is_monitor_found = GetMonitorInfo(hmon, (LPMONITORINFO) &mi);
>>>> + }
>>>> +
>>>> + if (is_monitor_found)
>>>> SetWindowPos(sys->hwnd, 0,
>>>> mi.rcMonitor.left,
>>>> mi.rcMonitor.top,
>>>> --
>>>> 2.11.0
>>>>
>>>> _______________________________________________
>>>> vlc-devel mailing list
>>>> To unsubscribe or modify your subscription options:
>>>> https://mailman.videolan.org/listinfo/vlc-devel
>>> _______________________________________________
>>> vlc-devel mailing list
>>> To unsubscribe or modify your subscription options:
>>> https://mailman.videolan.org/listinfo/vlc-devel
>>>
>> _______________________________________________
>> vlc-devel mailing list
>> To unsubscribe or modify your subscription options:
>> https://mailman.videolan.org/listinfo/vlc-devel
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
-------------- next part --------------
From 2ea2d7563fd36f6d3792bab895b3ead7058cf55e Mon Sep 17 00:00:00 2001
From: Steve Lhomme <robux4 at ycbcr.xyz>
Date: Thu, 24 Oct 2019 13:28:31 +0200
Subject: [PATCH] win32:vout_window: split the code to set the fullscreen for a
certain monitor
---
modules/video_output/win32/window.c | 25 ++++++++++++++++---------
1 file changed, 16 insertions(+), 9 deletions(-)
diff --git a/modules/video_output/win32/window.c b/modules/video_output/win32/window.c
index 7a91c5dc05d..47412daab44 100644
--- a/modules/video_output/win32/window.c
+++ b/modules/video_output/win32/window.c
@@ -153,6 +153,21 @@ static void SetTitle(vout_window_t *wnd, const char *title)
PostMessage( sys->hwnd, WM_VLC_CHANGE_TEXT, 0, 0 );
}
+static void SetFullscreenOnMonitor(vout_window_t *wnd, HMONITOR hmon)
+{
+ vout_window_sys_t *sys = wnd->sys;
+ MONITORINFO mi = {
+ .cbSize = sizeof(MONITORINFO),
+ };
+ if (GetMonitorInfo(hmon, &mi))
+ SetWindowPos(sys->hwnd, 0,
+ mi.rcMonitor.left,
+ mi.rcMonitor.top,
+ RECTWidth(mi.rcMonitor),
+ RECTHeight(mi.rcMonitor),
+ SWP_NOZORDER|SWP_FRAMECHANGED);
+}
+
static void SetFullscreen(vout_window_t *wnd, const char *id)
{
VLC_UNUSED(id);
@@ -170,15 +185,7 @@ static void SetFullscreen(vout_window_t *wnd, const char *id)
/* Retrieve current window position so fullscreen will happen
* on the right screen */
HMONITOR hmon = MonitorFromWindow(sys->hwnd, MONITOR_DEFAULTTONEAREST);
- MONITORINFO mi;
- mi.cbSize = sizeof(MONITORINFO);
- if (GetMonitorInfo(hmon, &mi))
- SetWindowPos(sys->hwnd, 0,
- mi.rcMonitor.left,
- mi.rcMonitor.top,
- RECTWidth(mi.rcMonitor),
- RECTHeight(mi.rcMonitor),
- SWP_NOZORDER|SWP_FRAMECHANGED);
+ SetFullscreenOnMonitor(wnd, hmon);
}
static void UnsetFullscreen(vout_window_t *wnd)
--
2.19.1.windows.1
More information about the vlc-devel
mailing list