web-dev-qa-db-ja.com

高DPI画面用のJavaベースのアプリケーションのスケーリングを修正

global 2x scale 画面設定で設定したものに従わないアプリケーション(主にJavaベース)があります。したがって、これらのアプリは、3200x1800pxの高DPI画面では本当にtinyです。

これらのアプリを小さな画面解像度で実行するにはどうすればよいですか?

23
rubo77

主な便利なアップグレードは、バックグラウンドスクリプトを使用して、自動的に解像度アプリケーションごとを設定し、同時に異なる(複数の)アプリケーションに異なる解像度を設定することです。

それがまさに以下のスクリプトが行うことです。

デフォルト1680x1050の解像度の例:

enter image description here

geditを実行し、自動的に640x480に変更します:

enter image description here

gnome-terminalを実行し、自動的に1280x1024に変更します:

enter image description here

アプリケーションが閉じられると、解像度は自動的に1680x1050に戻ります

使い方

  1. 以下のスクリプトを空のファイルにコピーし、set_resolution.pyとして保存します
  2. スクリプトの先頭で、次の行でデフォルトの解像度を設定します。

    #--- set the default resolution below
    default = "1680x1050"
    #---
    
  3. まったく同じディレクトリ(フォルダー)で、テキストファイルを作成します正確に名前:procsdata.txt。このテキストファイルで、目的のアプリケーションまたはプロセス、スペース、目的の解像度の順に設定します。次のような1行に1つのアプリケーションまたはスクリプト:

    gedit 640x480
    gnome-terminal 1280x1024
    Java 1280x1024
    

    enter image description here

  4. 次のコマンドでスクリプトを実行します。

    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

デスクトップアプリケーションとリストされたアプリケーションを頻繁に切り替えると、この動作が煩わしいことに注意してください。頻繁な解像度の切り替えが多すぎる可能性があります。

設定方法の違い

セットアップはほぼ同じです。これはwmctrlxdotoolを使用するという事実からのアパートです。

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

ノート

  • 現在、エラーなしで数時間実行していますが、徹底的にテストしてください。エラーが発生する可能性がある場合は、コメントを残してください。
  • このスクリプトは、そのままで、単一のモニター設定で機能します。
14
Jacob Vlijm

回避策として

アプリケーションを起動する前に解像度をfullHDに変更するbashスクリプトを作成し(この例ではAndroid St​​udio)、アプリケーションの終了時に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 を使用します

2
rubo77

Javaコマンドラインへの追加をテストします:-Dsun.Java2d.uiScale=2.0、または必要なスケールファクターに設定します。

2
epineda