News for hackers. Stuff that matters.
Re:Changing the primary display using the Win32 API by michidk on Sunday June 12, 2022 @11:04AM (#31715019)
But I don't see a way to set the primary display using those calls, or am I missing something?
Re:Changing the primary display using the Win32 API by CrendKing on Sunday June 12, 2022 @07:56PM (#31719416)
Whichever monitor's position is set to (0, 0) is the primary monitor. The following code assumes you have two monitors, and swaps the primary. Of course, to be more robust, you should not hard code the indices but do checking on the info types.

    let mut num_paths = MaybeUninit::uninit();
    let mut num_mode_infos = MaybeUninit::uninit();
    GetDisplayConfigBufferSizes(QDC_ONLY_ACTIVE_PATHS, num_paths.as_mut_ptr(), num_mode_infos.as_mut_ptr());

    let mut paths = vec![Default::default(); num_paths.assume_init() as _];
    let mut mode_infos = vec![Default::default(); num_mode_infos.assume_init() as _];

    QueryDisplayConfig(QDC_ONLY_ACTIVE_PATHS, num_paths.as_mut_ptr(), paths.as_mut_ptr(), num_mode_infos.as_mut_ptr(), mode_infos.as_mut_ptr(), null_mut());
    (mode_infos[1].Anonymous.sourceMode.position, mode_infos[3].Anonymous.sourceMode.position) = (mode_infos[3].Anonymous.sourceMode.position, mode_infos[1].Anonymous.sourceMode.position);
    SetDisplayConfig(&paths, &mode_infos, SDC_APPLY | SDC_USE_SUPPLIED_DISPLAY_CONFIG | SDC_ALLOW_CHANGES);