Зафиксируйте масштабирование java-приложений для высокого экрана DPI

Существуют некоторые приложения (главным образом базирующийся Java), которые не следуют за глобальным 2x масштаб, который я установил в экранных настройках. Таким образом, эти приложения являются действительно крошечными на моем высоком экране DPI с 3200x1800 пкс.

Как я могу получить эти приложения, работающие в меньшем разрешении экрана?

24
задан 21 May 2019 в 17:43

3 ответа

Основное обновление удобства должно было бы использовать фоновый сценарий, автоматически устанавливая разрешение на приложение, в то время как можно установить различные разрешения для различного (несколько) приложения сразу.

Это точно, что ниже делает сценарий.

Пример разрешения по умолчанию 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. В этом текстовом файле, набор требуемое приложение или процесс, сопровождаемый пространством, сопровождаемым нужным разрешением. Одно приложение или сценарий на строку, будучи похож:

    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> не производит вывод ни для одного из перечисленных приложений, он устанавливает разрешение для "принятия значение по умолчанию".


Править:

"Динамическая" версия (согласно просьбе)

В то время как версия выше работ с несколькими перечисленными приложениями, это только устанавливает разрешение для одного приложения за один раз.

Версия ниже может обработать различные приложения с другим (необходимым) разрешением, работая одновременно. Фоновый сценарий будет отслеживать то, что является передней стороной большая часть приложения и установит разрешение соответственно. Это также хорошо работает с 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

Примечания

  • Хотя у меня есть он работающий в течение нескольких часов без ошибки теперь, протестируйте его полностью. Если ошибка могла бы произойти, оставьте комментарий.
  • Сценарий - как это - работает над единственной установкой монитора.
15
ответ дан 23 November 2019 в 01:21

Как обходное решение

я создал сценарий удара, который изменяет разрешение на fullHD, прежде чем это запустит приложение (в этом Studio Android в качестве примера) и возвратит его к 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

и дают ему executeable права:

sudo chmod +x /usr/local/bin/studio

Тогда можно запустить его с Высокого звука + <час> F1 studio

Для других изменять-размеры-факторов, которые 2.0 видят , https://<час> askubuntu.com/a/486611/34298

Для легкого включения масштабирования и прочь в Firefox используют расширение Элементы Меню Масштабирования

2
ответ дан 23 November 2019 в 01:21

Тест, добавляющий к Вашей командной строке Java: -Dsun.java2d.uiScale=2.0, или набор это к масштабному коэффициенту Вы хотите.

3
ответ дан 23 November 2019 в 01:21

Другие вопросы по тегам:

Похожие вопросы: