修复基于Java的应用程序的缩放以实现高DPI屏幕


24

有些应用程序(主要基于Java)不遵循我在屏幕设置中设置的2x全局比例。因此,在我的3200x1800px高DPI屏幕上,这些应用程序确实很小

如何使这些应用程序以较小的屏幕分辨率运行?


Idea / Android Studio已打开一个错误,并可能在这里找到解决方案:code.google.com/p/android/issues/detail?id=68781
Anton

这是完全相同的问题,但是II也没有找到解决方案。
rubo77 2015年

您是否尝试过在命令行中使用-Dis.hidpi = true键运行AS / Idea?无论如何,这不是通用的解决方案,但我希望它会有所帮助。
安东

我改变了这种在结尾data/bin/studio.sheval "$JDK/bin/java" $ALL_JVM_ARGS -Djb.restart.code=88 -Dis.hidpi=true $MAIN_CLASS_NAME "$@"-但没有效果
rubo77

我添加了“动态”版本,更改了每个窗口的分辨率。使用alt-tab也可以正常工作。
Jacob Vlijm

Answers:


15

一个主要的便利升级是使用后台脚本,该脚本自动为每个应用程序设置分辨率,同时您可以一次为不同(多个)应用程序设置不同的分辨率。

这正是下面的脚本所做的。

默认分辨率的示例1680x1050

在此处输入图片说明

运行gedit,自动更改为640x480

在此处输入图片说明

运行gnome-terminal,自动更改为1280x1024

在此处输入图片说明

关闭应用程序后,分辨率自动设置为 1680x1050

如何使用

  1. 将以下脚本复制到一个空文件中,另存为 set_resolution.py
  2. 在脚本的开头,在以下行中设置默认分辨率:

    #--- set the default resolution below
    default = "1680x1050"
    #---
  3. 同一个目录(文件夹)中,创建一个文本文件,其名称精确为:procsdata.txt。在此文本文件中,设置所需的应用程序或进程,然后设置空格,然后设置所需的分辨率。每行一个应用程序或脚本,如下所示:

    gedit 640x480
    gnome-terminal 1280x1024
    java 1280x1024

    在此处输入图片说明

  4. 通过以下命令运行脚本:

    python3 /path/to/set_resolution.py

注意

脚本use 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 2015年

您可以使用此命令找出要添加到配置文件中的应用程序的名称:sleep 5 && cat "/proc/$(xdotool getwindowpid "$(xdotool getwindowfocus)")/comm"在5秒钟内聚焦该应用程序,然后获得所需的名称(来源:askubuntu.com/a/508539/34298
rubo77

在issuetracker进一步讨论github.com/rubo77/set_resolution.py
rubo77

1
这个脚本有一个更新,解决了很多问题,请访问github.com/rubo77/set_resolution.py
rubo77

您能否看一下这个,并告诉我是否与您相关?askubuntu.com/questions/742897/...
卡拉玛喀孩子

3

测试添加到您的Java命令行:-Dsun.java2d.uiScale=2.0,或将其设置为所需的比例因子。


2

解决方法

我创建了一个bash脚本,该脚本在启动应用程序之前(在此示例Android Studio中)将分辨率更改为fullHD,并在应用程序退出时将其更改回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中轻松打开和关闭缩放,请使用扩展“ 缩放菜单元素”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.