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


24

画面設定で設定したグローバルな2倍のスケールに従わないアプリケーション(主にJavaベース)がいくつかあります。したがって、これらのアプリは、3200x1800pxの高DPI画面では非常に小さくなります。

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


Idea / Android Studioにはバグがあり、おそらく解決策がここにあります:code.google.com/p/android/issues/detail?id
アントン

それはまったく同じ問題ですが、IIも解決策を見つけられませんでした。
-rubo77

コマンドラインで-Dis.hidpi = trueキーを使用してAS / Ideaを実行しようとしましたか?とにかくそれは一般的な解決策ではありませんが、助けになることを願っています。
アントン

私はこれを最後に変更しましたdata/bin/studio.sheval "$JDK/bin/java" $ALL_JVM_ARGS -Djb.restart.code=88 -Dis.hidpi=true $MAIN_CLASS_NAME "$@"-しかし効果はありません
-rubo77

ウィンドウごとに解像度を変更する「動的」バージョンを追加しました。alt-tabでも問題なく動作するはずです。
ジェイコブVlijm

回答:


15

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

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

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

ここに画像の説明を入力してください

実行中gedit、自動的に変更640x480

ここに画像の説明を入力してください

実行中gnome-terminal、自動的に変更1280x1024

ここに画像の説明を入力してください

アプリケーションを閉じると、解像度は自動的に元に戻ります 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

    ここに画像の説明を入力してください

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

    python3 /path/to/set_resolution.py

注意

スクリプトはpgrep -f <process>、スクリプトを含むすべての一致をキャッチするuseを使用します。考えられる欠点は、プロセスと同じ名前のファイルを開くときに名前の競合が発生する可能性があることです。
そのような問題に遭遇した場合は、変更してください:

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

ノート

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

@ rubo77スクリプトは、そのままでは、一度に1つのアプリケーションのみが実行されることを想定しています。リストされた複数のアプリケーションが実行されている場合、デスクトップへの切り替えも解像度の切り替えを引き起こすため、1つを選択します。ただし、これは変更できます。オプションとして設定します。
ジェイコブVlijm

このコマンドを使用して、構成ファイルに追加するアプリの名前を把握sleep 5 && cat "/proc/$(xdotool getwindowpid "$(xdotool getwindowfocus)")/comm"できます。5秒以内にアプリにフォーカスすると、目的の名前が取得されます(ソース:askubuntu.com/a/508539/34298
rubo77

中issuetrackerでさらに議論github.com/rubo77/set_resolution.py
rubo77

1
このスクリプトには更新があり、github.com
rubo77 / set_resolution.pyの

これを見て、関連すると思うかどうか教えてください。askubuntu.com/questions/742897/...
Kalamalkaキッド

3

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


2

回避策として

アプリケーションを起動する前に解像度を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でズームのオンとオフを簡単に切り替えるには、拡張機能のズームメニュー要素を使用します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.