Skip to content

Instantly share code, notes, and snippets.

@wvengen
Last active April 22, 2024 14:02
Show Gist options
  • Star 98 You must be signed in to star a gist
  • Fork 23 You must be signed in to fork a gist
  • Save wvengen/178642bbc8236c1bdb67 to your computer and use it in GitHub Desktop.
Save wvengen/178642bbc8236c1bdb67 to your computer and use it in GitHub Desktop.
Extend non-HiDPI external display above HiDPI internal display
#!/bin/sh
# extend non-HiDPI external display on DP* above HiDPI internal display eDP*
# see also https://wiki.archlinux.org/index.php/HiDPI
# you may run into https://bugs.freedesktop.org/show_bug.cgi?id=39949
# https://bugs.launchpad.net/ubuntu/+source/xorg-server/+bug/883319
EXT=`xrandr --current | sed 's/^\(.*\) connected.*$/\1/p;d' | grep -v ^eDP | head -n 1`
INT=`xrandr --current | sed 's/^\(.*\) connected.*$/\1/p;d' | grep -v ^DP | head -n 1`
ext_w=`xrandr | sed 's/^'"${EXT}"' [^0-9]* \([0-9]\+\)x.*$/\1/p;d'`
ext_h=`xrandr | sed 's/^'"${EXT}"' [^0-9]* [0-9]\+x\([0-9]\+\).*$/\1/p;d'`
int_w=`xrandr | sed 's/^'"${INT}"' [^0-9]* \([0-9]\+\)x.*$/\1/p;d'`
off_w=`echo $(( ($int_w-$ext_w)/2 )) | sed 's/^-//'`
xrandr --output "${INT}" --auto --pos ${off_w}x${ext_h} --scale 1x1 --output "${EXT}" --auto --scale 2x2 --pos 0x0
@luispabon
Copy link

luispabon commented Dec 7, 2017

This works well for my current set up where I have a 4K laptop (XPS 9560) beneath a FHD external display, but I have to run it twice: first time the external monitor has a big chunk of whatever's on the 4K monitor, and the second time it goes in fine.

On Unity, connect first the external monitor, and on display config make sure the scale factor for both screens is 2. Then run the script, perhaps twice.

The downside of this approach is however the FHD monitor is a scaled down version of 4K, so your computer is in fact driving 2x4K monitors (plus the overhead of resampling) and this is very resource intensive. The image quality on the FHD monitor is not great.

@msammarco
Copy link

I see the same as above with gnome 3. Unfortunately sometimes it doesn't seem to actually work on the second run

@PizzaBrandon
Copy link

Thanks for this script! I typically have to run it twice, as well, but I'll take that over the alternative!

@anidel
Copy link

anidel commented Jun 13, 2018

It's wierd. I seem to have a similar setup as many, a Surface Pro with a res of 2736x1824 and an external display in FHD, yet, if I run it as it is, the external display windows look very small. I want its scale to be 1 and the internal display to look better to the eye (i.e. scale of 0.5), this seems to do the opposite?

If I try to set the correct scaling, it looks weird, I guess I am not getting the formula, maybe I have to multiply by 2 rather than divide in the offset calculation?

@pulsation
Copy link

pulsation commented Jul 28, 2018

Thanks a lot for this script! To have the full external screen area usable, I had to add theses bits :

Get internal screen height,

int_h=`xrandr | sed 's/^'"${INT}"' [^0-9]* [0-9]\+x\([0-9]\+\).*$/\1/p;d'` 

Calculate total width calculation,

tot_w=$(( $ext_w+$int_w ))

And at last, append this option to the final xrandr command.

xrandr [...] --fb ${tot_w}x${int_h}

@ashwinvis
Copy link

I have an easy to modify python script here with arguably more options: https://github.com/ashwinvis/xrandr-extend

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment