높은 DPI 화면을위한 Java 기반 애플리케이션의 스케일링 수정


24

화면 설정에서 설정 한 전체 2x 스케일을 따르지 않는 일부 응용 프로그램 (주로 Java 기반)이 있습니다. 그래서 이러한 애플 리케이션은 정말 작은 3200x1800px 내 높은 DPI 화면.

더 작은 화면 해상도에서 이러한 앱을 실행하려면 어떻게해야합니까?


아이디어 / Android Studio에는 버그가 열렸으며 여기에 해결책이 있습니다. code.google.com/p/android/issues/detail?id=68781
Anton

그것은 정확히 같은 문제이지만 II는 거기에서도 해결책을 찾지 못했습니다.
rubo77

명령 행에서 -Dis.hidpi = true 키를 사용하여 AS / 아이디어를 실행 해 보셨습니까? 어쨌든 일반적인 해결책은 아니지만 도움이되기를 바랍니다.
Anton

나는 이것을 마지막에 data/bin/studio.sh다음 과 같이 변경했다 eval "$JDK/bin/java" $ALL_JVM_ARGS -Djb.restart.code=88 -Dis.hidpi=true $MAIN_CLASS_NAME "$@".-그러나 아무 효과가 없다
rubo77

창당 해상도를 변경하여 "동적"버전을 추가했습니다. alt-tab에서도 잘 작동합니다.
Jacob Vlijm

답변:


15

주요 편의 업그레이드는 백그라운드 스크립트를 사용하여 애플리케이션 당 해상도를 자동으로 설정하는 동시에 다른 (여러) 애플리케이션에 대해 다른 해상도를 한 번에 설정할 수 있습니다.

바로 아래 스크립트가하는 일입니다.

(A)의 예 기본 의 해상도 1680x1050:

여기에 이미지 설명을 입력하십시오

실행 중 (으 gedit)로 자동 변경 640x480:

여기에 이미지 설명을 입력하십시오

실행 중 (으 gnome-terminal)로 자동 변경 1280x1024:

여기에 이미지 설명을 입력하십시오

응용 프로그램을 닫으면 해상도가 자동으로 다시 설정됩니다 1680x1050

사용하는 방법

  1. 아래 스크립트를 빈 파일로 복사하여 다른 이름으로 저장하십시오. set_resolution.py
  2. 스크립트 헤드에서 다음과 같이 기본 해상도를 설정하십시오.

    #--- set the default resolution below
    default = "1680x1050"
    #---
  3. 에서 매우 동일한 디렉토리 (폴더)하는 TEXTFILE 생성 정확히 이름을 : procsdata.txt. 이 텍스트 파일에서 원하는 응용 프로그램이나 프로세스, 공백, 원하는 해상도를 차례로 설정하십시오. 한 줄에 하나의 애플리케이션 또는 스크립트

    gedit 640x480
    gnome-terminal 1280x1024
    java 1280x1024

    여기에 이미지 설명을 입력하십시오

  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.

데스크톱과 나열된 응용 프로그램간에 많이 전환하면이 동작이 성 가실 수 있습니다. 빈번한 해상도 스위치가 너무 많을 수 있습니다.

설정 방법의 차이점

설정은 이것 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 스크립트는 한 번에 하나의 응용 프로그램 만 실행한다고 가정합니다. 나열된 여러 응용 프로그램이 실행되면 하나의 응용 프로그램을 선택하여 너무 많은 해상도 스위치가 연속으로 표시되지 않도록합니다. 데스크톱으로 전환하면 해상도 스위치가 발생하기 때문입니다. 그러나 나는 그것을 바꿀 수 있습니다. 옵션으로 설정하겠습니다.
Jacob Vlijm

이 명령을 사용하여 구성 파일에 추가하려는 앱의 이름을 알아낼 수 있습니다. sleep 5 && cat "/proc/$(xdotool getwindowpid "$(xdotool getwindowfocus)")/comm"5 초 이내에 앱에 초점을 맞추고 원하는 이름을 얻습니다 (출처 : askubuntu.com/a/508539/34298 )
rubo77

에 이슈 트 래커에서 더 토론 github.com/rubo77/set_resolution.py
rubo77

1
이 스크립트는 업데이트가 해결할 수있는 문제에 많은 문제가 github.com/rubo77/set_resolution.py
rubo77

이걸보고 관련이 있다고 생각하는지 말해 주시겠습니까? askubuntu.com/questions/742897/…
Kalamalka Kid

3

java 명령 줄에 추가 테스트 : -Dsun.java2d.uiScale=2.0또는 원하는 배율로 설정하십시오.


2

해결 방법으로

응용 프로그램 (이 안드로이드 스튜디오에서)을 시작하기 전에 해상도를 fullHD로 변경하고 응용 프로그램이 종료되면 다시 3200x1800으로 변경하는 bash 스크립트를 만들었습니다.

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의 다른 크기 조정 요소에 대해서는 /ubuntu//a/486611/34298을 참조 하십시오.


Firefox에서 확대 / 축소를 쉽게 전환하려면 확장 메뉴 요소를 사용하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.