[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) &params);
>>> +
>>> +        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