[vlc-devel] [PATCH 4/4] win32: Send fullscreen to specific monitor
Steve Lhomme
robux4 at ycbcr.xyz
Thu Oct 24 13:17:57 CEST 2019
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
More information about the vlc-devel
mailing list