Certaines applications (principalement basées sur Java) ne suivent pas la échelle de 2x globale définie dans les paramètres d'écran. Donc, ces applications sont vraiment minuscules sur mon écran haute résolution avec 3200x1800px.
Comment puis-je faire fonctionner ces applications avec une résolution d'écran plus petite?
Une mise à niveau majeure consisterait à utiliser un script en arrière-plan, définissant automatiquement la résolution par application, tandis que vous pouvez définir différentes résolutions pour différentes applications (multiples) à la fois.
C'est exactement ce que fait le script ci-dessous.
Exemple de résolution par défaut de 1680x1050
:
Lancer gedit
, en passant automatiquement à 640x480
:
Lancer gnome-terminal
en passant automatiquement à 1280x1024
:
Lorsque l'application est fermée, la résolution est automatiquement redéfinie sur 1680x1050
set_resolution.py
Dans l'en-tête du script, définissez votre résolution par défaut, dans la ligne:
#--- set the default resolution below
default = "1680x1050"
#---
Dans le même répertoire (dossier), créez un fichier texte, exactement nommé: procsdata.txt
. Dans ce fichier texte, définissez l'application ou le processus souhaité, suivi d'un espace, suivi de la résolution souhaitée. Une application ou un script par ligne, ressemblant à:
gedit 640x480
gnome-terminal 1280x1024
Java 1280x1024
Exécutez le script à l'aide de la commande:
python3 /path/to/set_resolution.py
Le script utilise pgrep -f <process>
, qui intercepte toutes les correspondances, y compris les scripts. L'inconvénient possible est qu'il peut provoquer des conflits de noms lors de l'ouverture d'un fichier portant le même nom que le processus.
Si vous rencontrez de tels problèmes, changez:
matches.append([p, subprocess.check_output(["pgrep", "-f", p]).decode("utf-8")])
dans:
matches.append([p, subprocess.check_output(["pgrep", p]).decode("utf-8")])
#!/usr/bin/env python3
import subprocess
import os
import time
#--- set the default resolution below
default = "1680x1050"
#---
# read the datafile
curr_dir = os.path.dirname(os.path.abspath(__file__))
datafile = curr_dir+"/procsdata.txt"
procs_data = [l.split() for l in open(datafile).read().splitlines() if not l == "\n"]
procs = [pdata[0] for pdata in procs_data]
def check_matches():
# function to find possible running (listed) applications
matches = []
for p in procs:
try:
matches.append([p, subprocess.check_output(["pgrep", "-f", p]).decode("utf-8")])
except subprocess.CalledProcessError:
pass
match = matches[-1][0] if len(matches) != 0 else None
return match
matches1 = check_matches()
while True:
time.sleep(2)
matches2 = check_matches()
if matches2 == matches1:
pass
else:
if matches2 != None:
# a listed application started up since two seconds ago
resdata = [("x").join(item[1].split("x")) for item in \
procs_data if item[0] == matches2][0]
Elif matches2 == None:
# none of the listed applications is running any more
resdata = default
subprocess.Popen(["xrandr", "-s", resdata])
matches1 = matches2
time.sleep(1)
Lorsque le script démarre, il lit le fichier dans lequel vous avez défini vos applications et les résolutions d'écran correspondantes.
Il garde ensuite un œil sur les processus en cours d'exécution (exécutant pgrep -f <process>
pour chacune des applications) et définit la résolution si l'application démarre.
Lorsque pgrep -f <process>
ne produit pas de sortie pour l'une des applications répertoriées, il définit la résolution sur "par défaut".
Bien que la version ci-dessus fonctionne avec plusieurs applications répertoriées, elle ne définit que la résolution pour ne application à la fois.
La version ci-dessous peut gérer différentes applications avec une résolution différente (requise) s'exécutant simultanément. Le script d'arrière-plan garde la trace de l'application la plus en tête et définit la résolution en conséquence. Cela fonctionne aussi bien avec Alt+Tab.
Notez que ce comportement peut être gênant si vous basculez beaucoup entre le bureau et les applications répertoriées. le commutateur de résolution fréquente est peut-être trop.
La configuration est à peu près la même, mis à part le fait que celui-ci utilise wmctrl
et xdotool
:
Sudo apt-get install wmctrl
Sudo apt-get install xdotool
#!/usr/bin/env python3
import subprocess
import os
import sys
import time
#--- set default resolution below
resolution = "1680x1050"
#---
curr_dir = os.path.dirname(os.path.abspath(__file__))
datafile = curr_dir+"/procsdata.txt"
applist = [l.split() for l in open(datafile).read().splitlines()]
apps = [item[0] for item in applist]
def get(cmd):
try:
return subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
except subprocess.CalledProcessError:
pass
def get_pids():
# returns pids of listed applications; seems ok
runs = []
for item in apps:
pid = get("pgrep -f "+item)
if pid != None:
runs.append((item, pid.strip()))
return runs
def check_frontmost():
# returns data on the frontmost window; seems ok
frontmost = str(hex(int(get("xdotool getwindowfocus").strip())))
frontmost = frontmost[:2]+"0"+frontmost[2:]
try:
wlist = get("wmctrl -lpG").splitlines()
return [l for l in wlist if frontmost in l]
except subprocess.CalledProcessError:
pass
def front_pid():
# returns the frontmost pid, seems ok
return check_frontmost()[0].split()[2]
def matching():
# nakijken
running = get_pids(); frontmost = check_frontmost()
if all([frontmost != None, len(running) != 0]):
matches = [item[0] for item in running if item[1] == frontmost[0].split()[2]]
if len(matches) != 0:
return matches[0]
else:
pass
trigger1 = matching()
while True:
time.sleep(1)
trigger2 = matching()
if trigger2 != trigger1:
if trigger2 == None:
command = "xrandr -s "+resolution
else:
command = "xrandr -s "+[it[1] for it in applist if it[0] == trigger2][0]
subprocess.Popen(["/bin/bash", "-c", command])
print(trigger2, command)
trigger1 = trigger2
J'ai créé un script bash qui modifie la résolution en fullHD avant de lancer l'application (dans cet exemple Android Studio) et le rétablit en 3200x1800 à la fermeture de l'application:
Sudo nano /usr/local/bin/studio
Entrez ce script:
#!/bin/bash
# set scaling to x1.0
gsettings set org.gnome.desktop.interface scaling-factor 1
gsettings set com.ubuntu.user-interface scale-factor "{'HDMI1': 8, 'eDP1': 8}"
xrandr -s 1920x1080
# call your program
/usr/share/Android-studio/data/bin/studio.sh
# set scaling to x2.0
gsettings set org.gnome.desktop.interface scaling-factor 2
gsettings set com.ubuntu.user-interface scale-factor "{'HDMI1': 8, 'eDP1': 16}"
xrandr -s 3200x1800
et lui donner des droits exécutables:
Sudo chmod +x /usr/local/bin/studio
Ensuite, vous pouvez commencer avec Alt+F1 studio
name__
Pour les autres facteurs de redimensionnement que 2.0 voir https://askubuntu.com/a/486611/34298
Pour activer facilement le zoom sur Firefox, utilisez l’extension Eléments du menu Zoom
Testez l'ajout à votre ligne de commande Java: -Dsun.Java2d.uiScale=2.0
ou définissez-le sur le facteur d'échelle souhaité.