แก้ไขการปรับขนาดของแอปพลิเคชันที่ใช้ Java สำหรับหน้าจอ DPI สูง


24

มีแอปพลิเคชั่นบางตัว (ส่วนใหญ่ใช้จาวา) ที่ไม่เป็นไปตามสเกล 2x ทั่วโลกที่ฉันตั้งไว้ในการตั้งค่าหน้าจอ ดังนั้นแอพเหล่านี้จึงเล็กมากบนหน้าจอ DPI สูงของฉันด้วย 3200x1800px

ฉันจะทำให้แอพเหล่านี้ทำงานด้วยความละเอียดหน้าจอที่เล็กลงได้อย่างไร


Idea / Android Studio เปิดบั๊กและอาจเป็นทางออกที่นี่: code.google.com/p/android/issues/detail?id=68781
แอนตัน

นั่นเป็นปัญหาเดียวกัน แต่ II ก็ไม่พบวิธีแก้ไขเช่นกัน
rubo77

คุณได้ลองใช้ AS / Idea ด้วย -Dis.hidpi = คีย์จริงในบรรทัดคำสั่งหรือไม่ มันไม่ใช่วิธีทั่วไป แต่ฉันหวังว่ามันจะช่วยได้
Anton

ฉันเปลี่ยนสิ่งนี้ในตอนท้ายในdata/bin/studio.sh: eval "$JDK/bin/java" $ALL_JVM_ARGS -Djb.restart.code=88 -Dis.hidpi=true $MAIN_CLASS_NAME "$@"- แต่ไม่มีผลกระทบ
rubo77

ฉันเพิ่มเวอร์ชัน "ไดนามิก" เปลี่ยนความละเอียดต่อหน้าต่าง นอกจากนี้ยังควรทำงานได้ดีกับแท็บ alt
Jacob Vlijm

คำตอบ:


15

การอัพเกรดความสะดวกสบายที่สำคัญคือการใช้สคริปต์พื้นหลังการตั้งค่าความละเอียดต่อแอปพลิเคชันโดยอัตโนมัติในขณะที่คุณสามารถตั้งค่าความละเอียดที่แตกต่างกันสำหรับแอพพลิเคชั่นที่แตกต่างกัน

นั่นคือสิ่งที่สคริปต์ด้านล่างทำ

ตัวอย่างของการแก้ปัญหาเริ่มต้นของ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>ไม่สร้างผลลัพธ์สำหรับแอปพลิเคชันใด ๆ ที่อยู่ในรายการจะตั้งค่าความละเอียดเป็น "ค่าเริ่มต้น"


แก้ไข:

รุ่น "ไดนามิก" (ตามที่ร้องขอ)

แม้ว่าเวอร์ชั่นด้านบนจะใช้งานได้กับแอพพลิเคชั่นหลายตัว แต่จะตั้งค่าความละเอียดของแอพพลิเคชั่นทีละตัวเท่านั้น

เวอร์ชั่นด้านล่างสามารถรองรับแอปพลิเคชั่นต่าง ๆ ที่มีความละเอียดต่างกัน (จำเป็น) ซึ่งทำงานพร้อมกัน สคริปต์พื้นหลังจะติดตามแอปพลิเคชันส่วนใหญ่ที่ด้านหน้าและจะตั้งค่าความละเอียดตามนั้น นอกจากนี้ยังทำงานได้ดีกับ+AltTab

โปรดทราบว่าพฤติกรรมนี้อาจน่ารำคาญหากคุณสลับไปมาระหว่างเดสก์ท็อปและแอปพลิเคชั่นที่ระบุ สวิตช์ความละเอียดที่ใช้บ่อยอาจมากเกินไป

ความแตกต่างในวิธีการตั้งค่า

การตั้งค่าค่อนข้างเหมือนกันโดยสิ้นเชิงจากความจริงที่ว่าอันนี้ใช้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

หมายเหตุ

  • แม้ว่าฉันจะให้มันทำงานเป็นเวลาหลายชั่วโมงโดยไม่มีข้อผิดพลาดตอนนี้โปรดทดสอบอย่างละเอียด หากข้อผิดพลาดอาจเกิดขึ้นโปรดแสดงความคิดเห็น
  • สคริปต์มันทำงานบนการตั้งค่าจอภาพเดียว

@ 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 ก่อนที่จะเริ่มแอปพลิเคชัน (ในการตรวจสอบ 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 ดู/ubuntu//a/486611/34298


เพื่อให้ง่ายต่อการสลับการเปิดและปิดการซูมใน Firefox ให้ใช้องค์ประกอบเมนูย่อ / ขยาย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.