উচ্চ ডিপিআই স্ক্রিনের জন্য জাভা ভিত্তিক অ্যাপ্লিকেশনগুলির স্কেলিং ঠিক করুন


24

কিছু অ্যাপ্লিকেশন রয়েছে (মূলত জাভা ভিত্তিক) যা আমি স্ক্রীন-সেটিংসে সেট করা গ্লোবাল 2x স্কেল অনুসরণ করে না । সুতরাং এই অ্যাপসটি 3200x1800px সহ আমার উচ্চ ডিপিআই স্ক্রিনে সত্যিই ছোট t

আমি কীভাবে এই অ্যাপ্লিকেশনগুলিকে একটি ছোট স্ক্রিন রেজোলিউশনে চালিত করতে পারি?


আইডিয়া / অ্যান্ড্রয়েড স্টুডিওতে একটি বাগ খোলা হয়েছে এবং সম্ভবত এখানে একটি সমাধান রয়েছে: code.google.com/p/android/issues/detail?id=68781
এন্টন

এটি একই সমস্যাটি হুবহু, তবে II সেখানে কোনও সমাধান খুঁজে পেল না।
rubo77

আপনি কি -Dis.hidpi = কমান্ড লাইনে সত্য কীটি দিয়ে AS / আইডিয়া চালানোর চেষ্টা করেছেন? এটি যাইহোক, সাধারণ সমাধান নয়, তবে আমি আশা করি এটি সহায়তা করবে।
আন্তন

আমি এর শেষে এটি পরিবর্তন করেছি data/bin/studio.sh: eval "$JDK/bin/java" $ALL_JVM_ARGS -Djb.restart.code=88 -Dis.hidpi=true $MAIN_CLASS_NAME "$@"- তবে কোনও ফল নেই
rubo77

আমি একটি "গতিশীল" সংস্করণ যুক্ত করেছি, প্রতি উইন্ডোতে রেজোলিউশন পরিবর্তন করছি। এটি Alt-ট্যাব দিয়েও কাজ করতে হবে work
জ্যাকব ভিলিজম

উত্তর:


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

বিঃদ্রঃ

স্ক্রিপ্ট ব্যবহার 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>তালিকাভুক্ত অ্যাপ্লিকেশনগুলির জন্য কখন আউটপুট উত্পাদন করে না, এটি রেজোলিউশনটিকে "ডিফল্ট" হিসাবে সেট করে।


সম্পাদনা:

"ডায়নামিক" সংস্করণ (অনুরোধ হিসাবে)

উপরের সংস্করণটি একাধিক তালিকাভুক্ত অ্যাপ্লিকেশনগুলির সাথে কাজ করে, এটি একবারে কেবলমাত্র একটি অ্যাপ্লিকেশনের রেজোলিউশন সেট করে ।

নীচের সংস্করণটি একই সাথে চলমান, পৃথক (প্রয়োজনীয়) রেজোলিউশনের সাহায্যে বিভিন্ন অ্যাপ্লিকেশন পরিচালনা করতে পারে। ব্যাকগ্রাউন্ড স্ক্রিপ্টটি সবচেয়ে সর্বাধিক অ্যাপ্লিকেশন কী তা ট্র্যাক করবে এবং সেই অনুযায়ী রেজুলিউশন সেট করবে set এটি 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

নোট

  • যদিও আমি এখন এটি কোনও ত্রুটি ছাড়াই বেশ কয়েক ঘন্টা ধরে চলছে, দয়া করে এটি পুরোপুরি পরীক্ষা করুন। যদি কোনও ত্রুটি হতে পারে তবে দয়া করে একটি মন্তব্য দিন।
  • স্ক্রিপ্টটি এটি- একক মনিটর সেটআপে কাজ করে।

@ রুবো 77 স্ক্রিপ্টটি যেমনটি হয় তেমন ধরে নেওয়া হয় যে একবারে অ্যাপ্লিকেশনগুলির মধ্যে কেবল একটি চলমান। যদি একাধিক তালিকাভুক্ত অ্যাপ্লিকেশনগুলি চালিত হয়, তবে একাধিক রেজোলিউশন স্যুইচগুলি একপর্যায়ে প্রতিরোধ করার জন্য এটি একটিকে বেছে নেয়, যেহেতু ডেস্কটপে স্যুইচ করাও তখন রেজোলিউশন স্যুইচের কারণ হতে পারে। আমি তবে তা পরিবর্তন করতে পারি। আমি একটি বিকল্প হিসাবে সেট করব।
জ্যাকব ভ্লিজম

আপনি কনফিগারেশনের ফাইলটিতে যুক্ত করতে চান এমন অ্যাপের নাম বের করার জন্য আপনি এই আদেশটি ব্যবহার করতে পারেন: sleep 5 && cat "/proc/$(xdotool getwindowpid "$(xdotool getwindowfocus)")/comm"5 সেকেন্ডের মধ্যে অ্যাপ্লিকেশনটিকে ফোকাস করুন এবং আপনি পছন্দসই নামটি পেয়েছেন (উত্স: Askubuntu.com/a/508539/34298 )
রুবো 77


1
এই স্ক্রিপ্টটির একটি আপডেট রয়েছে, যা github.com/rubo77/set_resolution.py
রুবো

আপনি কি দয়া করে এটি দেখুন এবং আপনি যদি এটি সম্পর্কিত বলে মনে করেন? জিজ্ঞাসাবাবু
প্রশ্নস /

3

আপনার জাভা কমান্ড লাইনে টেস্ট যুক্ত করুন: -Dsun.java2d.uiScale=2.0বা এটি আপনার পছন্দ মতো স্কেল ফ্যাক্টারে সেট করুন।


2

একটি workaround হিসাবে

আমি একটি বাশ স্ক্রিপ্ট তৈরি করেছি যা অ্যাপ্লিকেশন শুরুর আগে রেজোলিউশনটিকে পুরো এইচডি তে পরিবর্তন করে (এই পরীক্ষায় অ্যান্ড্রয়েড স্টুডিওতে) এবং অ্যাপ্লিকেশনটি ছাড়ার পরে 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


ফায়ারফক্সে সহজ জুম চালু এবং বন্ধ করার জন্য এক্সটেনশন জুম মেনু উপাদানগুলি ব্যবহার করুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.