Memperbaiki penskalaan aplikasi berbasis java untuk layar DPI tinggi

24

Ada beberapa aplikasi (terutama berbasis java) yang tidak mengikuti skala global 2x yang saya atur di layar-pengaturan. Jadi aplikasi ini sangat kecil di layar DPI tinggi saya dengan 3200x1800px.

Bagaimana saya bisa menjalankan aplikasi ini dalam resolusi layar yang lebih kecil?

rubo77
sumber
Idea / Android Studio membuka bug dan kemungkinan solusinya di sini: code.google.com/p/android/issues/detail?id=68781
Anton
itu persis masalah yang sama, tetapi saya juga tidak menemukan solusi di sana.
rubo77
Sudahkah Anda mencoba menjalankan AS / Ide dengan -Dis.hidpi = true key pada command line? Lagipula itu bukan solusi umum, tapi saya harap ini akan membantu.
Anton
Saya mengubah ini di akhir data/bin/studio.sh: eval "$JDK/bin/java" $ALL_JVM_ARGS -Djb.restart.code=88 -Dis.hidpi=true $MAIN_CLASS_NAME "$@"- tapi tidak ada efek
rubo77
Saya menambahkan versi "dinamis", mengubah resolusi per jendela. Ini juga harus bekerja dengan baik dengan alt-tab.
Jacob Vlijm

Jawaban:

15

Peningkatan kenyamanan utama adalah dengan menggunakan skrip latar belakang, yang secara otomatis mengatur resolusi per aplikasi , sementara Anda dapat mengatur resolusi yang berbeda untuk berbagai aplikasi (beberapa) sekaligus.

Itulah yang dilakukan oleh naskah di bawah ini.

Contoh resolusi default1680x1050 :

masukkan deskripsi gambar di sini

Berjalan gedit, secara otomatis berubah ke 640x480:

masukkan deskripsi gambar di sini

Berjalan gnome-terminal, secara otomatis berubah ke 1280x1024:

masukkan deskripsi gambar di sini

Ketika aplikasi ditutup, resolusi secara otomatis diatur kembali ke 1680x1050

Bagaimana cara menggunakan

  1. Salin skrip di bawah ini ke file kosong, simpan sebagai set_resolution.py
  2. Di kepala skrip, setel resolusi default Anda, di baris:

    #--- set the default resolution below
    default = "1680x1050"
    #---
  3. Dalam direktori yang sama (folder), membuat textfile, tepatnya bernama: procsdata.txt. Dalam file teks ini, atur aplikasi atau proses yang diinginkan, diikuti oleh spasi, diikuti oleh resolusi yang diinginkan. Satu aplikasi atau skrip per baris, terlihat seperti:

    gedit 640x480
    gnome-terminal 1280x1024
    java 1280x1024

    masukkan deskripsi gambar di sini

  4. Jalankan skrip dengan perintah:

    python3 /path/to/set_resolution.py

Catatan

Penggunaan skrip pgrep -f <process>, yang menangkap semua kecocokan, termasuk skrip. Kelemahan yang mungkin adalah bahwa hal itu dapat menyebabkan bentrokan nama saat membuka file dengan nama yang sama dengan proses.
Jika Anda mengalami masalah seperti itu, ubah:

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

ke:

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

Naskah

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

Penjelasan

Ketika skrip dimulai, itu membaca file di mana Anda mendefinisikan aplikasi Anda dan resolusi layar yang diinginkan yang sesuai.

Itu kemudian mengawasi proses yang berjalan (berjalan pgrep -f <process>untuk masing-masing aplikasi) dan menetapkan resolusi jika aplikasi dijalankan.

Ketika pgrep -f <process>tidak menghasilkan output untuk salah satu aplikasi yang terdaftar, itu menetapkan resolusi ke "default".


Edit:

Versi "Dinamis" (seperti yang diminta)

Sementara versi di atas berfungsi dengan beberapa aplikasi yang terdaftar, itu hanya menetapkan resolusi untuk satu aplikasi pada satu waktu .

Versi di bawah ini dapat menangani berbagai aplikasi dengan resolusi yang berbeda (diperlukan), berjalan pada saat yang sama. Skrip latar belakang akan melacak aplikasi apa yang paling depan, dan akan mengatur resolusi yang sesuai. Ini juga berfungsi baik dengan Alt+ Tab.

Perhatikan bahwa perilaku ini mungkin mengganggu jika Anda sering berpindah antara desktop dan aplikasi yang terdaftar; sakelar resolusi sering mungkin terlalu banyak.

perbedaan cara pengaturan

Pengaturannya hampir sama, mulai dari kenyataan bahwa yang satu ini menggunakan wmctrldan xdotool:

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

Naskah

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

Catatan

  • Meskipun saya menjalankannya selama beberapa jam tanpa kesalahan sekarang, silakan mengujinya secara menyeluruh. Jika kesalahan mungkin terjadi, silakan tinggalkan komentar.
  • Script -seperti itu- bekerja pada satu pengaturan monitor.
Yakub Vlijm
sumber
@ rubo77 Skrip, dengan demikian, mengasumsikan hanya satu aplikasi yang berjalan pada satu waktu. Jika beberapa aplikasi yang terdaftar dijalankan, ia mengambil satu, untuk mencegah terlalu banyak sakelar resolusi secara berurutan, karena juga beralih ke desktop akan menyebabkan sakelar resolusi. Saya bisa mengubahnya. Saya akan menetapkan sebagai opsi.
Jacob Vlijm
Anda dapat menggunakan perintah ini untuk mencari tahu nama aplikasi yang ingin Anda tambahkan ke file konfigurasi: sleep 5 && cat "/proc/$(xdotool getwindowpid "$(xdotool getwindowfocus)")/comm"fokuskan aplikasi dalam waktu 5 detik dan Anda mendapatkan nama yang diinginkan (sumber: askubuntu.com/a/508539/34298 )
rubo77
Diskusi lebih lanjut di issuetracker di github.com/rubo77/set_resolution.py
rubo77
1
Skrip ini memiliki pembaruan, yang memecahkan banyak masalah di github.com/rubo77/set_resolution.py
rubo77
bisakah Anda melihat ini dan memberi tahu saya jika menurut Anda ada hubungannya? askubuntu.com/questions/742897/…
Kalamalka Kid
3

Uji penambahan ke baris perintah java Anda:, -Dsun.java2d.uiScale=2.0atau setel ke faktor skala yang Anda inginkan.

epineda
sumber
2

Sebagai solusinya

Saya membuat skrip bash yang mengubah resolusi menjadi fullHD sebelum memulai aplikasi (dalam contoh ini Android Studio) dan mengubahnya kembali ke 3200x1800 ketika aplikasi berhenti:

sudo nano /usr/local/bin/studio

Masukkan skrip ini:

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

dan berikan hak yang dapat dieksekusi:

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

Maka Anda bisa memulainya dengan Alt +F1 studio


Untuk faktor ukuran lain yang 2.0 lihat /ubuntu//a/486611/34298


Untuk mengaktifkan dan menonaktifkan zoom yang mudah di Firefox gunakan ekstensi Menu Zoom Elemen

rubo77
sumber