Yüksek DPI ekran için java tabanlı uygulamaların ölçeklendirilmesini düzeltin


24

Ekran ayarlarında belirttiğim global 2x ölçeğini izlemeyen bazı uygulamalar (çoğunlukla java tabanlı) var . Bu yüzden bu uygulamalar 3200x1800px ile yüksek DPI ekranımda gerçekten çok küçük .

Bu uygulamaları daha küçük ekran çözünürlüğünde nasıl çalıştırabilirim?


Idea / Android Studio'da bir hata açılmış ve muhtemelen burada bir çözüm var: code.google.com/p/android/issues/detail?id=68781
Anton

bu aynı sorun, ancak II orada da bir çözüm bulamadı.
rubo77

Komut satırında -Dis.hidpi = true anahtarını kullanarak AS / Idea çalıştırmayı denediniz mi? Zaten genel bir çözüm değil, ama umarım yardımcı olur.
Anton,

Sonunda bunu değiştirdim data/bin/studio.sh: eval "$JDK/bin/java" $ALL_JVM_ARGS -Djb.restart.code=88 -Dis.hidpi=true $MAIN_CLASS_NAME "$@"- fakat etkisiz
rubo77

Pencere başına çözünürlüğü değiştirerek "dinamik" bir sürüm ekledim. Ayrıca alt-tab ile iyi çalışmalıdır.
Jacob Vlijm,

Yanıtlar:


15

Önemli bir kolaylık yükseltme işlemi, uygulama başına çözünürlüğü otomatik olarak ayarlayan bir arka plan komut dosyası kullanmak olacaktır; aynı anda farklı (çoklu) uygulamalar için farklı çözünürlükler ayarlayabilirsiniz.

Bu tam olarak aşağıdaki betiğin yaptığı şeydir.

Varsayılan çözünürlük örneği 1680x1050:

görüntü tanımını buraya girin

Çalışıyor gedit, otomatik olarak değiştiriliyor 640x480:

görüntü tanımını buraya girin

Çalışıyor gnome-terminal, otomatik olarak değiştiriliyor 1280x1024:

görüntü tanımını buraya girin

Uygulama kapatıldığında, çözünürlük otomatik olarak 1680x1050

Nasıl kullanılır

  1. Aşağıdaki betiği boş bir dosyaya kopyalayın, olarak kaydedin. set_resolution.py
  2. Komut dizisinin başında, varsayılan çözünürlüğünüzü şu satıra ayarlayın:

    #--- set the default resolution below
    default = "1680x1050"
    #---
  3. Gelen çok aynı dizinde (klasör), bir textfile oluşturmak aynen adlı: procsdata.txt. Bu metin dosyasında, istediğiniz uygulamayı veya işlemi, ardından bir boşluk ve ardından istenen çözünürlüğü ayarlayın. Her satırda bir uygulama veya komut dosyası;

    gedit 640x480
    gnome-terminal 1280x1024
    java 1280x1024

    görüntü tanımını buraya girin

  4. Komut dosyasını komutla çalıştırın:

    python3 /path/to/set_resolution.py

Not

Komut pgrep -f <process>dosyaları dahil, tüm eşleşmeleri yakalayan komut dosyası kullanımı . Muhtemel olumsuz yanı, işlemle aynı ada sahip bir dosyayı açarken adın çakışmasına neden olmasıdır.
Bu gibi sorunlarla karşılaşırsanız, şunları değiştirin:

matches.append([p, subprocess.check_output(["pgrep", "-f", p]).decode("utf-8")])

içine:

matches.append([p, subprocess.check_output(["pgrep", p]).decode("utf-8")])

Senaryo

#!/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)

açıklama

Betik başladığında, uygulamalarınızı tanımladığınız dosyayı ve bunlara karşılık gelen istenen ekran çözünürlüklerini okur.

Daha sonra çalışan işlemlere ( pgrep -f <process>uygulamaların her biri için çalışan) göz kulak olur ve uygulama başlarsa çözünürlüğü ayarlar.

Ne zaman pgrep -f <process>listelenen uygulamaların herhangi biri için sonuç vermez, bu "varsayılan" Çözünürlüğü ayarlar.


Düzenle:

"Dinamik" versiyon (istenildiği gibi)

Yukarıdaki sürüm listelenen birden çok uygulamayla çalışırken, aynı anda yalnızca bir uygulama için çözünürlüğü ayarlar .

Aşağıdaki sürüm, aynı anda çalışan farklı (gereken) çözünürlükteki farklı uygulamaları yönetebilir. Arka plan betiği, en çok kullanılan uygulamanın ne olduğunu takip eder ve çözünürlüğü buna göre ayarlar. Ayrıca Alt+ ile de çalışır Tab.

Masaüstü ve listelenen uygulamalar arasında çok şey değiştirirseniz, bu davranışın rahatsız edici olabileceğini unutmayın; sık çözünürlük düğmesi çok fazla olabilir.

kurulumdaki farklılıklar

Kurulum hemen hemen aynı, bunun kullandığı gerçeğinden ötürü appart wmctrlve xdotool:

sudo apt-get install wmctrl
sudo apt-get install xdotool

Senaryo

#!/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

notlar

  • Şimdi birkaç saat boyunca hatasız çalışmasına rağmen, lütfen iyice test edin. Bir hata meydana gelebilir, lütfen bir yorum bırakın.
  • Bu betik, tek bir monitör kurulumunda çalışır.

@ rubo77 Kod, olduğu gibi, uygulamalardan yalnızca birinin aynı anda çalıştığını varsayar. Listelenen birden fazla uygulama çalışırsa, bir sırada çok fazla çözünürlük anahtarı önlemek için bir tane seçer, çünkü masaüstüne geçmek de bir çözünürlük anahtarına neden olur. Ancak bunu değiştirebilirim. Bir seçenek olarak ayarlayacağım.
Jacob Vlijm

Config dosyasına eklemek istediğiniz uygulamanın adını bulmak için bu komutu kullanabilirsiniz: sleep 5 && cat "/proc/$(xdotool getwindowpid "$(xdotool getwindowfocus)")/comm"uygulamayı 5 saniye içinde odaklayın ve istediğiniz adı elde edin (kaynak: askubuntu.com/a/508539/34298 )
rubo77

Başka bir şey için github.com/rubo77/set_resolution.py adresindeki ihracata ilişkin tartışma
rubo77

1
Bu komut dosyasının bir güncellemesi var, github.com/rubo77/set_resolution.py
rubo77

Lütfen buna bir göz atıp bununla ilgili olduğunu düşünür müsün? askubuntu.com/questions/742897/…
Kalamalka Kid

3

Java komut satırınıza ekleme testi yapın: -Dsun.java2d.uiScale=2.0veya istediğiniz ölçek faktörüne ayarlayın.


2

Geçici bir çözüm olarak

Uygulamaya başlamadan önce çözünürlüğü fullHD olarak değiştiren bir bash betiği oluşturdum (bu testte Android Studio'da) ve uygulama kapandığında tekrar 3200x1800 olarak değiştirildi:

sudo nano /usr/local/bin/studio

Bu betiği girin:

#!/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

ve çalıştırılabilir haklar verin:

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

Sonra Alt+ ile başlayabilirsinizF1 studio


2.0 olan diğer yeniden boyutlandırma faktörleri için bkz. Https://askubuntu.com/a/486611/34298


Firefox'ta yakınlaştırmayı kolayca açıp kapamak için Zoom Menu Elements uzantısını kullanın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.