Khắc phục mở rộng các ứng dụng dựa trên java cho màn hình DPI cao


24

Có một số ứng dụng (chủ yếu dựa trên java) không tuân theo tỷ lệ 2x toàn cầu mà tôi đã đặt trong cài đặt màn hình. Vì vậy, những ứng dụng này thực sự rất nhỏ trên màn hình DPI cao của tôi với 3200x1800px.

Làm cách nào để các ứng dụng này chạy ở độ phân giải màn hình nhỏ hơn?


Idea / Android Studio có một lỗi đã mở và có thể là một giải pháp tại đây: code.google.com/p/android/issues/detail?id=68781
Anton

đó chính xác là cùng một vấn đề, nhưng tôi cũng không tìm thấy giải pháp ở đó.
rubo77

Bạn đã thử chạy AS / Idea với -Dis.hidpi = true key trong dòng lệnh chưa? Dù sao đó cũng không phải là giải pháp chung, nhưng tôi hy vọng nó sẽ có ích.
Anton

Tôi đã thay đổi điều này vào cuối data/bin/studio.sh: eval "$JDK/bin/java" $ALL_JVM_ARGS -Djb.restart.code=88 -Dis.hidpi=true $MAIN_CLASS_NAME "$@"- nhưng không có hiệu lực
rubo77

Tôi đã thêm phiên bản "động", thay đổi độ phân giải trên mỗi cửa sổ. Nó cũng sẽ hoạt động tốt với alt-tab.
Jacob Vlijm

Câu trả lời:


15

Nâng cấp tiện lợi chính sẽ là sử dụng tập lệnh nền, tự động đặt độ phân giải cho mỗi ứng dụng , trong khi bạn có thể đặt các độ phân giải khác nhau cho các ứng dụng (nhiều) khác nhau cùng một lúc.

Đó chính xác là những gì kịch bản dưới đây làm.

Một ví dụ về độ phân giải mặc định1680x1050:

nhập mô tả hình ảnh ở đây

Đang chạy gedit, tự động thay đổi thành 640x480:

nhập mô tả hình ảnh ở đây

Đang chạy gnome-terminal, tự động thay đổi thành 1280x1024:

nhập mô tả hình ảnh ở đây

Khi ứng dụng được đóng, độ phân giải sẽ tự động được đặt lại 1680x1050

Cách sử dụng

  1. Sao chép tập lệnh bên dưới vào một tập tin trống, lưu nó dưới dạng set_resolution.py
  2. Trong phần đầu của tập lệnh, đặt độ phân giải mặc định của bạn, trong dòng:

    #--- set the default resolution below
    default = "1680x1050"
    #---
  3. Trong cùng một thư mục (thư mục), tạo một tệp văn bản, được đặt tên chính xác : procsdata.txt. Trong tệp văn bản này, đặt ứng dụng hoặc quy trình mong muốn, theo sau là khoảng trắng, theo sau là độ phân giải mong muốn. Một ứng dụng hoặc tập lệnh trên mỗi dòng, trông giống như:

    gedit 640x480
    gnome-terminal 1280x1024
    java 1280x1024

    nhập mô tả hình ảnh ở đây

  4. Chạy tập lệnh bằng lệnh:

    python3 /path/to/set_resolution.py

Ghi chú

Việc sử dụng tập lệnh pgrep -f <process>, bắt tất cả các kết quả khớp, bao gồm cả tập lệnh. Nhược điểm có thể là nó có thể gây ra xung đột tên khi mở tệp có cùng tên với quy trình.
Nếu bạn gặp phải vấn đề như vậy, hãy thay đổi:

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

vào:

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

Kịch bản

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

Giải trình

Khi tập lệnh bắt đầu, nó sẽ đọc tệp mà bạn đã xác định các ứng dụng của mình và độ phân giải màn hình mong muốn tương ứng của chúng.

Sau đó, nó sẽ theo dõi các quy trình đang chạy (chạy pgrep -f <process>cho từng ứng dụng) và đặt độ phân giải nếu ứng dụng khởi động.

Khi pgrep -f <process>không tạo đầu ra cho bất kỳ ứng dụng nào được liệt kê, nó sẽ đặt độ phân giải thành "mặc định".


Biên tập:

Phiên bản "Động" (theo yêu cầu)

Mặc dù phiên bản trên hoạt động với nhiều ứng dụng được liệt kê, nhưng nó chỉ đặt độ phân giải cho một ứng dụng tại một thời điểm .

Phiên bản dưới đây có thể xử lý các ứng dụng khác nhau với độ phân giải (bắt buộc) khác nhau, chạy cùng một lúc. Kịch bản nền sẽ theo dõi phần lớn ứng dụng nhất và sẽ đặt độ phân giải tương ứng. Nó cũng hoạt động tốt với Alt+ Tab.

Lưu ý rằng hành vi này có thể gây phiền nhiễu nếu bạn chuyển đổi nhiều giữa máy tính để bàn và các ứng dụng được liệt kê; việc chuyển đổi độ phân giải thường xuyên có thể là quá nhiều.

sự khác biệt trong cách thiết lập

Các thiết lập khá giống nhau, xuất phát từ thực tế là cái này sử dụng wmctrlxdotool:

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

Kịch bản

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

Ghi chú

  • Mặc dù tôi có nó chạy trong vài giờ mà không có lỗi bây giờ, xin vui lòng kiểm tra kỹ lưỡng. Nếu một lỗi có thể xảy ra, xin vui lòng để lại nhận xét.
  • Kịch bản - như nó - hoạt động trên một thiết lập màn hình.

@ rubo77 Kịch bản, giả sử, chỉ giả sử một trong số các ứng dụng chạy tại một thời điểm. Nếu nhiều ứng dụng được liệt kê chạy, nó chọn một, để ngăn quá nhiều chuyển đổi độ phân giải liên tiếp, vì việc chuyển sang máy tính để bàn sẽ gây ra chuyển đổi độ phân giải. Tôi có thể thay đổi điều đó. Tôi sẽ thiết lập như là một tùy chọn.
Jacob Vlijm

Bạn có thể sử dụng lệnh này để tìm ra tên của ứng dụng bạn muốn thêm vào tệp cấu hình: sleep 5 && cat "/proc/$(xdotool getwindowpid "$(xdotool getwindowfocus)")/comm"tập trung ứng dụng trong vòng 5 giây và bạn sẽ có được tên mong muốn (nguồn: askubfox.com/a/508539/34298 )
rubo77

Thảo luận thêm tại nhà phát hành trong github.com/rubo77/set_resolution.py
rubo77

1
Kịch bản này có một bản cập nhật, giải quyết rất nhiều vấn đề tại github.com/rubo77/set_resolution.py
rubo77

bạn có thể vui lòng nhìn vào điều này và cho tôi biết nếu bạn nghĩ nó liên quan? Askubfox.com/questions/742897/ cường
Kalamalka Kid

2

Như một cách giải quyết

Tôi đã tạo một tập lệnh bash thay đổi độ phân giải thành fullHD trước khi khởi động ứng dụng (trong bài kiểm tra Android Studio này) và thay đổi lại thành 3200x1800 khi ứng dụng thoát:

sudo nano /usr/local/bin/studio

Nhập tập lệnh này:

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

và cung cấp cho nó quyền thực thi:

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

Sau đó, bạn có thể bắt đầu với Alt+F1 studio


Đối với các yếu tố thay đổi kích thước khác mà 2.0, hãy xem https://askubfox.com/a/486611/34298


Để dễ dàng chuyển đổi bật và tắt thu phóng trong Firefox, hãy sử dụng tiện ích Menu Zoom tiện ích mở rộng


2

Kiểm tra thêm vào dòng lệnh java của bạn : -Dsun.java2d.uiScale=2.0, hoặc đặt nó thành một hệ số tỷ lệ bạn muốn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.