আমি কীভাবে প্রারম্ভকালে একটি প্রোগ্রাম চালাতে পারি, কমানো?


19

আমি কেবল টেলিগ্রাম চালিত হতে চাই এবং এটি স্টার্টআপ অ্যাপগুলিতে যুক্ত করেছি। মুল বক্তব্যটি হ'ল আমার এটি হ্রাস করা দরকার। কোন আদেশ?


টেলিগ্রাম শুরু করার আদেশ কী এবং অ্যাপ্লিকেশন শুরু হওয়ার ঠিক পরে উইন্ডোটির নাম কী?
জ্যাকব Vlijm

আমি যে কমান্ডটি ব্যবহার করেছি সেটি কেবল অ্যাপ্লিকেশনটির পথ এবং উইন্ডোর নাম টেলিগ্রাম ডেস্কটপ
হোসেইন সোল্টানলু

হাই হোসিয়েন, সেক্ষেত্রে আপনি উইন্ডো শিরোনামের পরিবর্তে পিড ব্যবহার পছন্দ করতে পারেন, আমার উত্তর সম্পাদনা করেছেন।
জ্যাকব ভিলিজম

@ জ্যাকবভিলিজম ধন্যবাদ! এটি ব্যাপকভাবে দক্ষ এবং দরকারী! তবে প্রথম পদ্ধতিটি চলক উইন্ডো নামের ক্ষেত্রে নির্বিঘ্নে কাজ করে। সাবাশ!
হোসেইন সোল্টানলু

1
@ সুমিতদেশমুখ আপনি একজন অবিশ্বাস্যরূপে সুন্দর এবং উদার ব্যক্তি। সত্যিই!
জ্যাকব ভিলিজম

উত্তর:


29

একটি অ্যাপ্লিকেশন শুরু হ্রাস করা হয়েছে

একটি অ্যাপ্লিকেশনটি ছোট্ট উপায়ে শুরু করতে দুটি কমান্ড লাগে:

  • অ্যাপ্লিকেশন শুরু
  • এর উইন্ডোটি ছোট করুন

সুতরাং, কমান্ড বা স্ক্রিপ্টটি "স্মার্ট" হওয়া দরকার; দ্বিতীয় কমান্ডটি আসলে অ্যাপ্লিকেশন উইন্ডোটি উপস্থিত হওয়ার জন্য অপেক্ষা করা উচিত।

কোনও অ্যাপ্লিকেশন শুরু করার সাধারণ সমাধান im

নীচের স্ক্রিপ্টটি এটি করে এবং একটি অ্যাপ্লিকেশনকে ন্যূনতম উপায়ে শুরু করার সাধারণ সমাধান হিসাবে ব্যবহার করা যেতে পারে। এটি কেবল বাক্য গঠনতে চালান:

<script> <command_to_run_the_application> <window_name>

এই পান্ডুলিপি

#!/usr/bin/env python3
import subprocess
import sys
import time

subprocess.Popen(["/bin/bash", "-c", sys.argv[1]])
windowname = sys.argv[2]

def read_wlist(w_name):
    try:
        l = subprocess.check_output(["wmctrl", "-l"]).decode("utf-8").splitlines()
        return [w.split()[0] for w in l if w_name in w][0]
    except (IndexError, subprocess.CalledProcessError):
        return None

t = 0
while t < 30:
    window = read_wlist(windowname)
    time.sleep(0.1)
    if window != None:
        subprocess.Popen(["xdotool", "windowminimize", window])
        break
    time.sleep(1)
    t += 1

কিভাবে ব্যবহার করে

স্ক্রিপ্ট উভয়ের প্রয়োজন wmctrlএবং xdotool:

sudo apt-get install wmctrl xdotool

তারপর:

  1. একটি ফাঁকা ফাইলে স্ক্রিপ্টটি অনুলিপি করুন, এটি সংরক্ষণ করুন startup_minimizd.py
  2. স্ক্রিপ্টটি পরীক্ষা করুন (উদাহরণস্বরূপ) geditকমান্ড দিয়ে:

    python3 /path/to/startup_minimizd.py gedit gedit
    
  3. যদি সব ঠিকঠাক কাজ করে তবে কমান্ডটি (আপনার আবেদনের জন্য) যুক্ত করুন Startup Applications

ব্যাখ্যা

  • স্ক্রিপ্ট অ্যাপ্লিকেশন শুরু করে, প্রথম আর্গুমেন্ট হিসাবে আপনি যে কমান্ডটি দিয়েছিলেন তা চালিয়ে
  • তারপরে স্ক্রিপ্টটি wmctrlআপনার দ্বিতীয় যুক্তির নাম অনুসারে উইন্ডোগুলির জন্য উইন্ডো তালিকার (সাহায্যে ) পরীক্ষা করে ।
  • যদি উইন্ডোটি উপস্থিত হয়, তা অবিলম্বে সহায়তার সাহায্যে হ্রাস করা হয় xdotool যদি কোনও কারণে উইন্ডোটি প্রদর্শিত না হতে পারে তবে একটি অন্তহীন লুপ প্রতিরোধ করতে, স্ক্রিপ্টটি উইন্ডোটি প্রদর্শিত হওয়ার জন্য 30 সেকেন্ডের একটি সময়সীমা অনুশীলন করে।

বিঃদ্রঃ

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


সম্পাদনা

উইন্ডোটি এর পিড দ্বারা স্বীকৃতি

উইন্ডোর শিরোনামটি যদি অনিশ্চিত বা পরিবর্তনশীল হয় বা উইন্ডোটির নামের সাথে সংঘর্ষের ঝুঁকি থাকে, তবে pidএটি ব্যবহার করা আরও নির্ভরযোগ্য পদ্ধতি method

নীচের স্ক্রিপ্টটি অ্যাপ্লিকেশনটির পিড ব্যবহারের উপর ভিত্তি করে তৈরি হয়েছে, যেমন উভয়ের আউটপুট wmctrl -lpএবং ps -ef

সেটআপটি প্রায় একই রকম, তবে উইন্ডো শিরোনামটি এই সংস্করণে প্রয়োজন হয় না, সুতরাং এটি চালানোর জন্য আদেশটি হ'ল:

python3 /path/to/startup_minimizd.py <command_to_run_application>

প্রথম স্ক্রিপ্টের মতো এটিরও উভয় প্রয়োজন wmctrlandxdotool

এই পান্ডুলিপি

#!/usr/bin/env python3
import subprocess
import sys
import time

command = sys.argv[1]
command_check = command.split("/")[-1]

subprocess.Popen(["/bin/bash", "-c", command])

t = 1
while t < 30:
    try:
        w_list = [l.split() for l in subprocess.check_output(["wmctrl", "-lp"]).decode("utf-8").splitlines()]
        proc = subprocess.check_output(["pgrep", "-f", command_check]).decode("utf-8").strip().split()
        match = sum([[l[0] for l in w_list if p in l] for p in proc], [])
        subprocess.Popen(["xdotool", "windowminimize", match[0]])
        break
    except (IndexError, subprocess.CalledProcessError):
        pass
    t += 1
    time.sleep(1)

দ্বিতীয় স্ক্রিপ্টে নোট

যদিও সাধারণভাবে দ্বিতীয় সংস্করণটি আরও নির্ভরযোগ্য হওয়া উচিত, ক্ষেত্রে যখন অ্যাপ্লিকেশনটি একটি মোড়ক স্ক্রিপ্ট দ্বারা শুরু করা হয়, কমান্ডের পিডটি শেষ পর্যন্ত বলা অ্যাপ্লিকেশন থেকে আলাদা হবে।

এই জাতীয় ক্ষেত্রে, আমি প্রথম স্ক্রিপ্টটি ব্যবহার করার পরামর্শ দিচ্ছি।



EDIT2 স্টিমের জন্য স্ক্রিপ্টের একটি নির্দিষ্ট সংস্করণ

একটি মন্তব্যে অনুরোধ করা হয়েছে, একটি সংস্করণের নীচে, বিশেষত স্টিম কমিয়ে আনা শুরু করার জন্য তৈরি করা হয়েছিল।

বাষ্পের জন্য একটি নির্দিষ্ট সংস্করণ কেন?

দেখা যাচ্ছে যে Steamএকটি "সাধারণ" অ্যাপ্লিকেশন থেকে বেশ আলাদা আচরণ করে:

  • দেখা যাচ্ছে একটি পিড Steamচালায় না , তবে কম নয় (আমার পরীক্ষায়) আট!
  • Steamকমপক্ষে দুটি উইন্ডো (একটি স্প্ল্যাশ-যেমন উইন্ডো) দিয়ে শুরুতে চলে তবে কখনও কখনও একটি অতিরিক্ত বার্তা উইন্ডো উপস্থিত হয়।
  • স্টিমের উইন্ডোজ রয়েছে pid 0যা স্ক্রিপ্টে যেমন ছিল তেমন সমস্যা।
  • মূল উইন্ডোটি তৈরি হওয়ার পরে, উইন্ডোটি দ্বিতীয় বা তার পরে দ্বিতীয় বার উত্থাপিত হয়, সুতরাং একটি একক ক্ষুদ্রাকরণ কাজটি করে না।

এই ব্যতিক্রমী আচরণটি Steamস্ক্রিপ্টটির একটি বিশেষ সংস্করণ চেয়েছে যা নীচে যুক্ত করা হয়েছে। স্ক্রিপ্টটি শুরু হয় Steamএবং 12 সেকেন্ডের মধ্যে এটি সংশ্লিষ্ট সমস্ত নতুন উইন্ডোতে নজর রাখে WM_CLASS, সেগুলি ছোট করা হয়েছে কিনা তা পরীক্ষা করে। যদি তা না হয় তবে স্ক্রিপ্ট নিশ্চিত করে যে তারা হবে।

মূল স্ক্রিপ্টের মতো এটিরও প্রয়োজন wmctrlএবং xdotoolইনস্টল করা উচিত।

এই পান্ডুলিপি

#!/usr/bin/env python3
import subprocess
import time

command = "steam"
subprocess.Popen(["/bin/bash", "-c", command])

def get(cmd):
    return subprocess.check_output(cmd).decode("utf-8").strip()

t = 0

while t < 12:
    try:
        w_list = [l.split()[0] for l in get(["wmctrl", "-l"]).splitlines()]
        for w in w_list:
            data = get(["xprop", "-id", w])
            if all(["Steam" in data, not "_NET_WM_STATE_HIDDEN" in data]):
                subprocess.Popen(["xdotool", "windowminimize", w])
    except (IndexError, subprocess.CalledProcessError):
        pass

    t += 1
    time.sleep(1)

এটি ব্যবহার করতে

  • খালি ফাইলটিতে কেবল অনুলিপি করুন, এটি সংরক্ষণ করুন runsteam_minimized.py
  • কমান্ড দ্বারা এটি চালান:

    python3 /path/to/runsteam_minimized.py
    

বাহ, মহান! আমি কাউকেই except:ফিরিয়ে দিতে চাইনি যদিও । সম্ভবত আরও ভাল এটি ব্যর্থ যাতে আপনি কি ব্যর্থ দেখতে পান; অন্যথায়, এটি যে কোনও ধরণের বিভিন্ন কারণে ভেঙে যেতে পারে এবং অযৌক্তিকভাবে পাস করবে।
ফেডোরকুই

1
@ ফেডরকিই ভাল, দুটি ব্যতিক্রম সম্ভবত ঘটতে পারে: subprocess.CalledProcesError ( বগির ফলস্বরূপ wmctrl) এবং IndexError(সাধারণ ব্যতিক্রম) এক মিনিটে সম্পাদনা করবে :)। উল্লেখ করার জন্য ধন্যবাদ
জ্যাকব ভিলিজম

@ হোসেইনসোল্টানলু ঠিক কী আদেশ দিয়ে আপনি স্ক্রিপ্টটি চালাচ্ছেন?
জ্যাকব ভিলিজম

@ জ্যাকবভিলিজম স্ক্রিপ্টটি ভালভাবে কাজ করে তবে আরও একটি সমস্যা রয়েছে যা আপনি এটি সমাধান করতে পারেন। যখনই আমার অপঠিত বার্তা রয়েছে এবং আমি অ্যাপটি খুলি, দুটি অপঠিত বার্তা থাকায় উইন্ডোটির নাম "টেলিগ্রাম (2)" এর মতো পরিবর্তিত হয় এবং এইভাবে স্ক্রিপ্টটি নামের পরিবর্তনের কাজ করবে না।
হোসেইন সোল্টানলু

2
@ জেডিহোল্যান্ড আমি নিশ্চিত যে এটি ঠিক করা যেতে পারে। পরের কয়েক দিনের মধ্যে এটি কোথাও অনুসন্ধান করবে :)
জ্যাকব ভিলিজম

3

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

সম্পর্কিত সূচনা প্রোগ্রাম কমান্ড স্ট্রিং সহ কয়েকটি উদাহরণ এখানে দেওয়া হয়েছে:

  • টেলিগ্রামের (সংস্করণ 0.7.10 থেকে) -startintrayবিকল্প রয়েছে:<path-to-Telegram>/Telegram -startintray
  • বাষ্পের -silentবিকল্প রয়েছে:/usr/bin/steam %U -silent
  • ট্রান্সমিশনের --minimizedবিকল্প রয়েছে:/usr/bin/transmission-gtk --minimized

ইউনিটিতে এই অ্যাপ্লিকেশনগুলি লঞ্চের আইকনগুলির চেয়ে শীর্ষ মেনু বারে আইকন হিসাবে ছোট করা শুরু করে, যদিও আপনি অ্যাপ্লিকেশনটি ব্যবহার শুরু করার পরে সাধারণ লঞ্চ আইকনটি এখনও উপস্থিত হবে। অন্যান্য অ্যাপ্লিকেশনগুলি আলাদা আচরণ করতে পারে।


1

আমি জ্যাকবের স্ক্রিপ্টগুলি নিয়েছি এবং আরও সর্বজনীন তৈরি করতে তাদের কিছুটা সংশোধন করেছি।

#!/usr/bin/python

import os
import subprocess
import sys
import time
import signal

WAIT_TIME = 10


def check_exist(name):
    return subprocess.Popen("which "+name,
                            shell=True,
                            stdout=subprocess.PIPE
                            ).stdout.read().rstrip("-n")


def killpid(pidlist):
    for pid in pidlist:
        args = ["xdotool",
                "search",
                "--any",
                "--pid",
                pid,
                "--name",
                "notarealprogramname",
                "windowunmap",
                "--sync",
                "%@"]
        subprocess.Popen(args)


def killname(name):
    args = ["xdotool",
            "search",
            "--any",
            "--name",
            "--class",
            "--classname",
            name,
            "windowunmap",
            "--sync",
            "%@"]
    subprocess.Popen(args)


sys.argv.pop(0)

if check_exist(sys.argv[0]) == "":
    sys.exit(1)
if check_exist("xdotool") == "":
    sys.stderr.write("xdotool is not installed\n")
    sys.exit(1)
if check_exist("wmctrl") == "":
    sys.stderr.write("wmctrl is not installed\n")
    sys.exit(1)

try:
    prog = subprocess.Popen(sys.argv, preexec_fn=os.setsid)
except OSError, e:
    sys.exit(1)

time.sleep(WAIT_TIME)
idlist = subprocess.Popen("pgrep -g " + str(prog.pid),
                          shell=True,
                          stdout=subprocess.PIPE
                          ).stdout.read().splitlines()

ps1 = os.fork()
if ps1 > 0:
    ps2 = os.fork()

if ps1 == 0:  # Child 1
    os.setpgid(os.getpid(), os.getpid())
    killpid(idlist)
    sys.exit(0)
elif ps2 == 0:  # Child 2
    killname(os.path.basename(sys.argv[0]))
    sys.exit(0)
elif ps1 > 0 and ps2 > 0:  # Parent
    time.sleep(WAIT_TIME)
    os.killpg(os.getpgid(int(ps1)), signal.SIGTERM)
    os.kill(ps2, signal.SIGTERM)
    os.waitpid(ps1, 0)
    os.waitpid(ps2, 0)
    sys.exit(0)
else:
    exit(1)

প্রধান পার্থক্যগুলি হ'ল:

  • প্রোগ্রামটি প্রক্রিয়াটির জন্য গ্রুপ আইডি (জিআইডি) সেট করে। সুতরাং, সমস্ত শিশু প্রক্রিয়া এবং তাদের উইন্ডোজ সহজেই পাওয়া যাবে
  • xdotool - sync বিকল্পটি কিছুক্ষণ লুপের পরিবর্তে ব্যবহৃত হয়
  • স্ক্রিপ্ট প্রোগ্রামটিতে তর্কগুলি পাস করার অনুমতি দেয়

প্রোগ্রামটির শিশু প্রক্রিয়াগুলিকে কাঁটাচামচ করার জন্য ডাব্লুআইএআইটিটাইমকে যথেষ্ট বড় সেট করা উচিত। আমার কম্পিউটারে এটি বাষ্পের মতো বড় প্রোগ্রামগুলির পক্ষে যথেষ্ট। প্রয়োজনে এটি বাড়ান।

সংযোজন

xdotoolএর বিকল্পটি windowunmapকিছু অ্যাপ্লিকেশন এবং ট্রে প্রোগ্রাম (উদাহরণস্বরূপ লিনাক্স পুদিনার ট্রে) দিয়ে কাজ করতে পারে, সুতরাং সেই ব্যতিক্রমগুলির জন্য এখানে স্ক্রিপ্টের বিকল্প সংস্করণ দেওয়া আছে।

#!/usr/bin/python

import os
import subprocess
import sys
import time
import signal

WAIT_TIME = 10


def check_exist(name):
    return subprocess.Popen("which "+name,
                            shell=True,
                            stdout=subprocess.PIPE
                            ).stdout.read().rstrip("-n")


def killpid(pidlist):
    for pid in pidlist:
        args = ["xdotool",
                "search",
                "--sync",
                "--pid",
                pid]
        for i in subprocess.Popen(args,
                                  stdout=subprocess.PIPE).\
                stdout.read().splitlines():
            if i != "":
                subprocess.Popen("wmctrl -i -c " +
                                 hex(int(i)), shell=True)


def killname(name):
    args = ["xdotool",
            "search",
            "--sync",
            "--any",
            "--name",
            "--class",
            "--classname",
            name]
    for i in subprocess.Popen(args,
                              preexec_fn=os.setsid,
                              stdout=subprocess.PIPE)\
            .stdout.read().splitlines():
        if i != "":
            subprocess.Popen("wmctrl -i -c " + hex(int(i)),
                             shell=True)


sys.argv.pop(0)

if check_exist(sys.argv[0]) == "":
    sys.exit(1)
if check_exist("xdotool") == "":
    sys.stderr.write("xdotool is not installed\n")
    sys.exit(1)
if check_exist("wmctrl") == "":
    sys.stderr.write("wmctrl is not installed\n")
    sys.exit(1)


try:
    prog = subprocess.Popen(sys.argv, preexec_fn=os.setsid)
except OSError, e:
    sys.exit(1)

time.sleep(WAIT_TIME)
idlist = subprocess.Popen("pgrep -g " + str(prog.pid),
                          shell=True,
                          stdout=subprocess.PIPE
                          ).stdout.read().splitlines()

ps1 = os.fork()
if ps1 > 0:
    ps2 = os.fork()

if ps1 == 0:  # Child 1
    os.setpgid(os.getpid(), os.getpid())
    killpid(idlist)
    sys.exit(0)
elif ps2 == 0:  # Child 2
    killname(os.path.basename(sys.argv[0]))
    sys.exit(0)
elif ps1 > 0 and ps2 > 0:  # Parent
    time.sleep(WAIT_TIME)
    os.killpg(os.getpgid(int(ps1)), signal.SIGTERM)
    os.kill(ps2, signal.SIGTERM)
    os.waitpid(ps1, 0)
    os.waitpid(ps2, 0)
    sys.exit(0)
else:
    exit(1)

আমি আপনার প্রথম স্ক্রিপ্ট চেষ্টা করেছিলাম। এটি কাজ করে না বা পর্যাপ্ত পরিমাণে কমেনি। আমি এটি হিসাবে সংরক্ষণ startminimized। তখন আমি দৌড়ে গেলাম startminimized gnome-calendar। ক্যালেন্ডার খোলা এবং চলমান রাখা?
খুরশিদ আলম

1
আপনি পরিবর্তনশীল বাড়াতে চেষ্টা করতে পারেন WAIT_TIME। আমি দুর্বল কম্পিউটারগুলির জন্য 40 সেকেন্ড বিলম্ব ব্যবহার করি। এছাড়াও আপনি দ্বিতীয় স্ক্রিপ্ট চেষ্টা করতে পারেন কারণ এটি অ্যাপ্লিকেশনটি ছোট করতে আলাদা কমান্ড ব্যবহার করে।
সের্গেই

1

যদি প্রোগ্রামটি ট্রেতে বন্ধ করা হচ্ছে, তবে প্রোগ্রামের উইন্ডোটি এটি হ্রাস করার পরিবর্তে আসলে প্রোগ্রাম উইন্ডোটি বন্ধ করতে চাইবে। এই জাতীয় প্রোগ্রামের একটি উদাহরণ ভাইবার। এই ক্ষেত্রে কেউ নিম্নলিখিত স্ক্রিপ্ট ব্যবহার করতে পারে start_closed.sh:

#!/bin/bash

# Check that there is only one input argument
if [[ $# -gt 1 ]]; then
echo "Usage: $0 <program-to-start>"
exit 1
fi

$1 &                               # Start program passed in first argument
pid=$!                             # Get PID of last started program
xdotool search --sync --pid $pid | # Wait for window with PID to appear...
xargs wmctrl -i -c                 # ...and close it

ব্যবহার: <path-to-script> <program-to-start>


1
আপনি লক্ষ করতে পারেন যে xdotoolওয়েল্যান্ডের সাথে ইনস্টলেশনে সঠিকভাবে কাজ করবে না।
ভিডিওনাথ

0

আমি কেবল সার্ফিং করছিলাম এবং এই প্রশ্নটি এসেছিলাম, তাই আমি কেবল ভাবছিলাম যে আপনার অপারেটিং সিস্টেমটি কী? আমার হিসাবে আমি উবুন্টু বুজি 18.04 এলটিএস ব্যবহার করছি তাই এই অপারেটিং সিস্টেমে এটি খুব সহজ।

কেবল মেনুতে যান

মেনু থেকে বুদগি ডেস্কটপ সেটিংসে যান

এবং

ডেস্কটপ সেটিং থেকে অটো স্টার্টে যান

এটি আপনাকে "+" অ্যাড থেকে 2 টি বিকল্প দেবে

1. অ্যাপ্লিকেশন যোগ করুন

কমান্ড যুক্ত করুন

অ্যাপ্লিকেশন যুক্ত নির্বাচন করে সমস্ত অ্যাপ্লিকেশন তালিকাভুক্ত হবে আপনার যে কোনও অ্যাপ্লিকেশনটি নির্বাচন করুন এবং এটি আপনি যখন কম্পিউটারটি শুরু করবেন তখন এটি শুরু হবে এবং এটিও হ্রাস করা হবে।


0

ট্রিতে বন্ধ প্রোগ্রামগুলি আমার দরকার ছিল, ছোট করা হয়নি এবং আমি এখানে পোস্ট করা সমস্ত স্ক্রিপ্টগুলি চেষ্টা করেছি, যেগুলি কাজ করেছে, কেবল কিছু প্রোগ্রামের জন্য কাজ করেছে অন্যের জন্য নয়। সুতরাং আমি এমন একটি কোডিং করেছি যা আরও ভাল কাজ করে (আপনি উইন্ডোটি উপস্থিত দেখছেন না কেবল ট্রে আইকনটি, এটি স্থানীয় দেখায়) এবং আমি চেষ্টা করেছি এমন সমস্ত প্রোগ্রামের জন্য কাজ করে। এটি জ্যাকব এর উপর ভিত্তি করে। এই স্ক্রিপ্টটি দিয়ে আপনাকে প্রোগ্রামের উপর নির্ভর করে একটি যুক্তি যুক্ত করতে হবে (নীচে দেখুন) তবে সবসময় আমার পক্ষে প্রচুর প্রোগ্রামের সাথে কাজ করা উচিত এটি স্টিমের সাথেও কাজ করা উচিত।

ব্যবহার:

  1. sudo apt-get install wmctrl xdotool
  2. স্ক্রিপ্টটিকে সংরক্ষণের startup_closed.pyঅনুমতি হিসাবে এটি সংরক্ষণ করুন এবং তারপরে কার্যকর করুনpython3 ./startup_closed.py -c <command to open program>
  3. যদি প্রোগ্রাম ট্রে আইকনটি না দেখায় বা উইন্ডোটি না দেখায় তবে আপনাকে এই আর্গুমেন্টগুলির মধ্যে একটি যুক্ত করতে হবে: -splashবা -hide, পরীক্ষা এবং ত্রুটির দ্বারা by যেমন: python3 ./startup_closed.py -hide -c teamviewerবাpython3 ./startup_closed.py -splash -c slack
  4. আরও যুক্তি রয়েছে তবে সম্ভবত আপনার এগুলির দরকার নেই। সাহায্যে কখন এবং কেন যুক্তিগুলির প্রয়োজন তা সম্পর্কে সম্পূর্ণ বিশদ রয়েছে:./startup_closed.py --help

লিপি:

#!/usr/bin/env python3
import subprocess
import sys
import time
import argparse
import random

parser = argparse.ArgumentParser(description='This script executes a command you specify and closes or hides the window/s that opens from it, leaving only the tray icon. Useful to "open closed to tray" a program. If the program does not have a tray icon then it just gets closed. There is no magic solution to achieve this that works for all the programs, so you may need to tweek a couple of arguments to make it work for your program, a couple of trial and error may be required with the arguments -splash and -hide, you probably will not need the others.')

parser.add_argument("-c", type=str, help="The command to open your program. This parameter is required.", required=True)
parser.add_argument("-splash", help="Does not close the first screen detected. Closes the second window detected. Use in programs that opens an independent splash screen. Otherwise the splash screen gets closed and the program cannot start.", action='store_true', default=False)
parser.add_argument("-hide", help="Hides instead of closing, for you is the same but some programs needs this for the tray icon to appear.", action='store_true', default=False)
parser.add_argument("-skip", type=int, default=0, help='Skips the ammount of windows specified. For example if you set -skip 2 then the first 2 windows that appear from the program will not be affected, use it in programs that opens multiple screens and not all must be closed. The -splash argument just increments by 1 this argument.', required=False)
parser.add_argument("-repeat", type=int, default=1, help='The amount of times the window will be closed or hidden. Default = 1. Use it for programs that opens multiple windows to be closed or hidden.', required=False)
parser.add_argument("-delay", type=float, default=10, help="Delay in seconds to wait before running the application, useful at boot to not choke the computer. Default = 10", required=False)
parser.add_argument("-speed", type=float, default=0.02, help="Delay in seconds to wait between closing attempts, multiple frequent attempts are required because the application may be still loading Default = 0.02", required=False)

args = parser.parse_args()

if args.delay > 0:
    finalWaitTime = random.randint(args.delay, args.delay * 2);
    print(str(args.delay) + " seconds of delay configured, will wait for: " + str(finalWaitTime))
    time.sleep(finalWaitTime)
    print("waiting finished, running the application command...")

command_check = args.c.split("/")[-1]
subprocess.Popen(["/bin/bash", "-c", args.c])

hasIndependentSplashScreen = args.splash
onlyHide = args.hide
skip = args.skip
repeatAmmount = args.repeat
speed = args.speed

actionsPerformed = 0
lastWindowId = 0

if hasIndependentSplashScreen:
    skip += 1

while True:
    try:
        w_list = [l.split() for l in subprocess.check_output(["wmctrl", "-lp"]).decode("utf-8").splitlines()]
        proc = subprocess.check_output(["pgrep", "-f", command_check]).decode("utf-8").strip().split()
        match = sum([[l[0] for l in w_list if p in l] for p in proc], [])
        if len(match) > 0:
            windowId = match[0]
            if windowId != lastWindowId:
                if skip > 0:
                    skip -= 1
                    print("skipped window: " + windowId)
                    lastWindowId = windowId
                else:
                    print("new window detected: " + windowId)
                    if onlyHide:
                        subprocess.Popen(["xdotool", "windowunmap", windowId])
                        print("window was hidden: " + windowId)
                    else:
                        subprocess.Popen(["xdotool", "key", windowId, "alt+F4"])
                        print("window was closed: " + windowId)

                    actionsPerformed += 1
                    lastWindowId = windowId

            if actionsPerformed == repeatAmmount:
                break

    except (IndexError, subprocess.CalledProcessError):
        break

    time.sleep(speed)

print("finished")

0

আমি একটি বরং মার্জিত সমাধান নিয়ে এসেছি যা একচেটিয়াভাবে নির্ভর করে xdotoolএবং টেলিগ্রামের মতো অ্যাপ্লিকেশনগুলিতে "স্টার্ট মিনিমাইজড" যুক্তি না থাকার জন্য এটি বেশ কার্যকর ।

একমাত্র ক্ষতি হ'ল প্রতিটি অ্যাপ্লিকেশনের জন্য সমাধানটি ম্যানুয়ালি তৈরি করতে হবে তবে ধরে নেওয়া যে এটি কোনও সমস্যা নয় (উদাহরণস্বরূপ: আপনি যদি লগ ইন করার পরে আপনার পর্দা দূষিত করার অনুমতি না দিয়ে কোনও নির্দিষ্ট অ্যাপ্লিকেশনটি অটোস্টার্ট করতে চান) , এটি অনেক সহজ এবং সোজা ।

আসল উদাহরণ

## Starts Telegram and immediately closes it
xdotool search --sync --onlyvisible --name '^Telegram$' windowclose &
telegram-desktop &
## Starts WhatsApp and immediately closes it
xdotool search --sync --onlyvisible --name '(\([0-9]*\) ){0,1}(WhatsApp$|WhatsApp Web$)' windowclose &
whatsapp-nativefier &

সমাধান

প্রথম নজরে, আপনি মনে করতে পারেন যে প্রক্রিয়া 'পিআইডি বা ক্লাসের সাথে মেলে ব্যবহার করা আরও ভাল however উদাহরণগুলি হল 0x0 উইন্ডো যা প্রকৃতপক্ষে কোনও বিজ্ঞপ্তি, সিস্ট্র্রে আইকন বা অন্য কোনও "লুকানো" উইন্ডোর জন্য অপেক্ষা করে।

সমাধানটি একটি এক্সডটুল কমান্ড তৈরি করছে যা সর্বদা কেবল একটি অনন্য উইন্ডো দেয় । আমার উভয় উদাহরণগুলিতে যা ব্যবহার করে করা হয়েছিল --name, তবে আপনি একাধিক নির্বাচককে একত্রিত করতে পারেন --all (উদাহরণস্বরূপ: প্রদত্ত শ্রেণীবিন্যাসের সাথে + একটি শ্রেণীর নাম + একটি নাম রেজেক্স) মেলানসাধারণত একটি ভাল --nameরেজেক্স কৌশলটি করে।

আপনার searchশর্তগুলি তৈরি করার পরে , কেবলমাত্র প্যারামিটার এবং আপনার অবস্থার সাথে এক্সডটুলের (শেল থেকে বিচ্ছিন্ন) উদাহরণ --syncঅনুসরণ করুন windowclose। পরে আপনার অ্যাপ্লিকেশন চালান:

xdotool search --sync [... myapp-match-conditions] windowclose &
my-app

আপনার xdotool search --helpপছন্দসই উইন্ডোটি টার্গেট করতে সক্ষম হওয়ার জন্য আপনি যে সংমিশ্রণগুলি করতে পারেন তার সমস্ত সম্ভাবনার জন্য পরীক্ষা করুন । কখনও কখনও এটি জটিল হয়ে ওঠে এবং আপনাকে বেশ কয়েকটি শর্ত একত্রিত করতে হবে, তবে একবার শেষ হয়ে গেলে এটি খুব কমই ব্যর্থ হবে (যদি না কোনও আপডেট প্রয়োগ প্রয়োগ না করে এবং আপনার বাস্তবায়ন ভঙ্গ না করে)।

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