एक उच्च DPI स्क्रीन के लिए जावा-आधारित अनुप्रयोगों की स्केलिंग को ठीक करें


24

कुछ एप्लिकेशन (मुख्य रूप से जावा आधारित) हैं जो स्क्रीन-सेटिंग्स में सेट किए गए वैश्विक 2x पैमाने का पालन नहीं करते हैं। तो ये ऐप 3200x1800px के साथ मेरी उच्च डीपीआई स्क्रीन पर वास्तव में छोटे हैं ।

मैं इन ऐप्स को छोटे स्क्रीन रिज़ॉल्यूशन में कैसे चला सकता हूं?


: आइडिया / एंड्रॉयड स्टूडियो एक बग खोला है और संभवतः एक समाधान यहाँ code.google.com/p/android/issues/detail?id=68781
एंटोन

यह ठीक उसी मुद्दे पर है, लेकिन II को वहां भी समाधान नहीं मिला।
रूबों।।

क्या आपने कमांड लाइन में AS / Idea को -Dis.hidpi = true key चलाने की कोशिश की है? यह सामान्य समाधान नहीं है, वैसे भी, लेकिन मुझे उम्मीद है कि यह मदद करेगा।
एंटोन

मैंने इसे अंत में बदल दिया data/bin/studio.sh: eval "$JDK/bin/java" $ALL_JVM_ARGS -Djb.restart.code=88 -Dis.hidpi=true $MAIN_CLASS_NAME "$@"- लेकिन कोई प्रभाव नहीं
rubo77

मैंने एक "डायनामिक" संस्करण जोड़ा, प्रति विंडो रिज़ॉल्यूशन बदलते हुए। यह ऑल्ट-टैब के साथ भी ठीक काम करना चाहिए।
याकूब 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>किसी भी सूचीबद्ध एप्लिकेशन के लिए आउटपुट का उत्पादन नहीं होता है, तो यह रिज़ॉल्यूशन को "डिफ़ॉल्ट" पर सेट करता है।


संपादित करें:

"डायनामिक" संस्करण (अनुरोध के अनुसार)

जबकि ऊपर का संस्करण कई सूचीबद्ध अनुप्रयोगों के साथ काम करता है, यह केवल एक समय में एक आवेदन के लिए रिज़ॉल्यूशन सेट करता है

नीचे दिया गया संस्करण एक ही समय में चल रहे (आवश्यक) रिज़ॉल्यूशन के साथ विभिन्न अनुप्रयोगों को संभाल सकता है। बैकग्राउंड स्क्रिप्ट क्या सबसे सामने वाला एप्लीकेशन है, इस पर नज़र रखेगी और उसी के अनुसार रिज़ॉल्यूशन सेट करेगी। यह Alt+ के साथ भी ठीक काम करता है Tab

ध्यान दें कि यदि आप डेस्कटॉप और सूचीबद्ध अनुप्रयोगों के बीच बहुत अधिक स्विच करते हैं तो यह व्यवहार कष्टप्रद हो सकता है; लगातार रिज़ॉल्यूशन स्विच बहुत अधिक हो सकता है।

सेटअप करने के तरीके में अंतर

सेटअप बहुत अधिक है, इस तथ्य से है कि यह एक का उपयोग करता है 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

टिप्पणियाँ

  • हालांकि मेरे पास अब एक त्रुटि के बिना कई घंटों तक चल रहा है, कृपया इसे अच्छी तरह से परखें। यदि कोई त्रुटि हो सकती है, तो कृपया एक टिप्पणी छोड़ दें।
  • स्क्रिप्ट -as यह है- सिंगल मॉनिटर सेटअप पर काम करता है।

@ rubo77 स्क्रिप्ट, जैसा कि है, मानती है कि एक समय में केवल एक ही एप्लिकेशन चलता है। यदि एकाधिक सूचीबद्ध अनुप्रयोग चलते हैं, तो यह एक को चुनता है, एक पंक्ति में बहुत सारे रिज़ॉल्यूशन स्विच को रोकने के लिए, क्योंकि डेस्कटॉप पर स्विच करने के बाद भी रिज़ॉल्यूशन स्विच हो जाता है। हालांकि मैं इसे बदल सकता हूं। मैं एक विकल्प के रूप में सेट करूंगा।
जैकब व्लिजम

आप इस कमांड का उपयोग उस एप्लिकेशन के नाम का पता लगाने के लिए कर सकते हैं जिसे आप कॉन्फ़िगर फ़ाइल में जोड़ना चाहते हैं: 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/…
कलामलका किड

3

अपने जावा कमांड लाइन में टेस्ट जोड़ें: -Dsun.java2d.uiScale=2.0या इसे एक स्केल फैक्टर पर सेट करें जिसे आप चाहते हैं।


2

वर्कअराउंड के रूप में

मैंने एक बैश स्क्रिप्ट बनाई जो एप्लिकेशन को शुरू करने से पहले फुलएचडी में रिज़ॉल्यूशन को बदल देती है (इस परीक्षा में एंड्रॉइड स्टूडियो में) और एप्लिकेशन के क्विट होने पर इसे वापस 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 देखें


फ़ायरफ़ॉक्स में आसान स्विचिंग जूम ऑन और ऑफ के लिए एक्सटेंशन ज़ूम मेनू एलिमेंट्स का उपयोग करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.