global 2x scale 画面設定で設定したものに従わないアプリケーション(主にJavaベース)があります。したがって、これらのアプリは、3200x1800pxの高DPI画面では本当にtinyです。
これらのアプリを小さな画面解像度で実行するにはどうすればよいですか?
主な便利なアップグレードは、バックグラウンドスクリプトを使用して、自動的に解像度アプリケーションごとを設定し、同時に異なる(複数の)アプリケーションに異なる解像度を設定することです。
それがまさに以下のスクリプトが行うことです。
デフォルト1680x1050
の解像度の例:
gedit
を実行し、自動的に640x480
に変更します:
gnome-terminal
を実行し、自動的に1280x1024
に変更します:
アプリケーションが閉じられると、解像度は自動的に1680x1050
に戻ります
set_resolution.py
として保存しますスクリプトの先頭で、次の行でデフォルトの解像度を設定します。
#--- set the default resolution below
default = "1680x1050"
#---
まったく同じディレクトリ(フォルダー)で、テキストファイルを作成します正確に名前:procsdata.txt
。このテキストファイルで、目的のアプリケーションまたはプロセス、スペース、目的の解像度の順に設定します。次のような1行に1つのアプリケーションまたはスクリプト:
gedit 640x480
gnome-terminal 1280x1024
Java 1280x1024
次のコマンドでスクリプトを実行します。
python3 /path/to/set_resolution.py
スクリプトはpgrep -f <process>
を使用します。これは、スクリプトを含むすべての一致をキャッチします。考えられる欠点は、プロセスと同じ名前のファイルを開くときに名前の競合が発生する可能性があることです。
そのような問題が発生した場合は、変更してください:
matches.append([p, subprocess.check_output(["pgrep", "-f", p]).decode("utf-8")])
に:
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)
スクリプトが開始されると、アプリケーションを定義したファイルと、それに対応する目的の画面解像度が読み取られます。
次に、実行中のプロセス(各アプリケーションに対してpgrep -f <process>
を実行)を監視し、アプリケーションの起動時に解像度を設定します。
pgrep -f <process>
がリストされたアプリケーションのいずれに対しても出力を生成しない場合、解像度を「デフォルト」に設定します。
上記のバージョンは複数のリストされたアプリケーションで動作しますが、一度に1つのアプリケーションの解像度のみを設定します。
以下のバージョンは、異なる(必要な)解像度で異なるアプリケーションを同時に処理できます。バックグラウンドスクリプトは、最前面のアプリケーションを追跡し、それに応じて解像度を設定します。また、 Alt+Tab。
デスクトップアプリケーションとリストされたアプリケーションを頻繁に切り替えると、この動作が煩わしいことに注意してください。頻繁な解像度の切り替えが多すぎる可能性があります。
セットアップはほぼ同じです。これはwmctrl
と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
アプリケーションを起動する前に解像度をfullHDに変更するbashスクリプトを作成し(この例ではAndroid Studio)、アプリケーションの終了時に3200x1800に戻します:
Sudo nano /usr/local/bin/studio
このスクリプトを入力してください:
#!/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
実行可能な権利を付与します。
Sudo chmod +x /usr/local/bin/studio
その後、あなたはそれを始めることができます Alt+F1 studio
2.0の他のサイズ変更要因については、 https://askubuntu.com/a/486611/34298 を参照してください
Firefoxでズームを簡単にオン/オフに切り替えるには、拡張機能 Zoom Menu Elements を使用します
Javaコマンドラインへの追加をテストします:-Dsun.Java2d.uiScale=2.0
、または必要なスケールファクターに設定します。