সম্পাদনা - নতুন উত্তর-
নীচের উত্তরগুলি গুলি / এখনও সম্পূর্ণ বৈধ, এবং তাই প্রস্তাবিত বিকল্পগুলি। চলমান অন্তর্দৃষ্টি আমাকে নীচের সূচকটি ব্যবহার করার জন্য এই বিকল্পটি যুক্ত করেছে, এটি সম্ভবত সবচেয়ে মার্জিত সমাধান।
এই হিসাবে, এটি সম্ভবত বিকল্প 5 (একটি .ডেস্কটপ ফাইল ব্যবহার করে) প্রতিস্থাপন করা উচিত।
কেবল তালিকা থেকে অ্যাপলিকেশনটি বেছে নিন এবং সংশ্লিষ্ট অ্যাপ্লিকেশনটির সমস্ত উইন্ডো (বর্তমান ভিউপোর্টে উপস্থিত) উত্থাপন করবে:
কিভাবে ব্যবহার করে
পিপিএ থেকে:
sudo add-apt-repository ppa:vlijm/upfront
sudo apt-get update
sudo apt-get install upfront
... বা ম্যানুয়ালি:
#!/usr/bin/env python3
import signal
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('AppIndicator3', '0.1')
from gi.repository import Gtk, AppIndicator3, GObject
import time
from threading import Thread
import os
import subprocess
import getpass
currpath = os.path.dirname(os.path.realpath(__file__))
class Indicator():
def __init__(self):
self.app = 'raise_apps'
iconpath = os.path.join(currpath, "raise.png")
self.indicator = AppIndicator3.Indicator.new(
self.app, iconpath,
AppIndicator3.IndicatorCategory.OTHER)
self.indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)
self.indicator.set_menu(self.create_menu())
# the thread:
self.update = Thread(target=self.check_recent)
# daemonize the thread to make the indicator stopable
self.update.setDaemon(True)
self.update.start()
def create_menu(self):
# creates the (initial) menu
self.menu = Gtk.Menu()
# separator
initial = Gtk.MenuItem("Fetching list...")
menu_sep = Gtk.SeparatorMenuItem()
self.menu.append(initial)
self.menu.append(menu_sep)
# item_quit.show()
self.menu.show_all()
return self.menu
def raise_wins(self, *args):
index = self.menu.get_children().index(self.menu.get_active())
selection = self.menu_items2[index][1]
for w in selection:
execute(["wmctrl", "-ia", w])
def set_new(self):
# update the list, appearing in the menu
for i in self.menu.get_children():
self.menu.remove(i)
for app in self.menu_items2:
sub = Gtk.MenuItem(app[0])
self.menu.append(sub)
sub.connect('activate', self.raise_wins)
# separator
menu_sep = Gtk.SeparatorMenuItem()
self.menu.append(menu_sep)
# quit
item_quit = Gtk.MenuItem('Quit')
item_quit.connect('activate', self.stop)
self.menu.append(item_quit)
self.menu.show_all()
def get_apps(self):
# calculate screen resolution
res_output = get("xrandr").split(); idf = res_output.index("current")
res = (int(res_output[idf+1]), int(res_output[idf+3].replace(",", "")))
# creating window list on current viewport / id's / application names
w_data = [l.split() for l in get(["wmctrl", "-lpG"]).splitlines()]
# windows on current viewport
relevant = [w for w in w_data if 0 < int(w[3]) < res[0] and 0 < int(w[4]) < res[1]]
# pids
pids = [l.split() for l in get(["ps", "-u", getpass.getuser()]).splitlines()]
matches = [[p[-1], [w[0] for w in relevant if w[2] == p[0]]] for p in pids]
return [m for m in matches if m[1]]
def check_recent(self):
self.menu_items1 = []
while True:
time.sleep(4)
self.menu_items2 = self.get_apps()
for app in self.menu_items2:
app[0] = "gnome-terminal" if "gnome-terminal" in app[0] else app[0]
if self.menu_items2 != self.menu_items1:
GObject.idle_add(
self.set_new,
priority=GObject.PRIORITY_DEFAULT
)
self.menu_items1 = self.menu_items2
def stop(self, source):
Gtk.main_quit()
def get(command):
return subprocess.check_output(command).decode("utf-8")
def execute(command):
subprocess.Popen(command)
Indicator()
GObject.threads_init()
signal.signal(signal.SIGINT, signal.SIG_DFL)
Gtk.main()
সূচক প্রয়োজন wmctrl
sudo apt-get wmctrl
একটি খালি ফাইলে সূচকটি অনুলিপি করুন, এটি সংরক্ষণ করুন raise_apps.py
নিচের ছবিটি অনুলিপি, এইভাবে সংরক্ষণ এটা ঠিক নামে raise.png
এ এক এবং একই ডিরেক্টরির সূচক হিসেবে।
তারপরে এটি কমান্ডটি দ্বারা চালিত করুন:
পাইথন 3 /পাথ / টো / রাইজ_এপস.পি
আপনি যদি অ্যাপ্লিকেশন শুরু করতে চান তবে যুক্ত করুন:
/bin/bash -c "sleep 10 && python3 /path/to/raise_apps.py"
পুরানো উত্তর:
প্রশ্ন সম্পর্কে
সঠিক সরঞ্জামের সাহায্যে কোনও অ্যাপ্লিকেশনের সমস্ত উইন্ডো "কেবল" উত্থাপন করা খুব জটিল নয়। কেবলমাত্র বর্তমান ভিউপোর্টের উইন্ডো উত্থাপিত হয়েছে তা নিশ্চিত করা কিছুটা জটিল complicated তবে আসল চ্যালেঞ্জটি হ'ল ব্যবহারকারীর জন্য ক্রিয়াটি উপলব্ধ করার জন্য একটি সুবিধাজনক উপায় সন্ধান করা way
নীচে পাঁচটি বিকল্প যত্ন নিতে দেখাতে কিভাবে এটি করতে কাজ করতে হবে। সমস্ত বিকল্প ব্যবহার করার জন্য প্রস্তুত। শেষ বিকল্পটি অবশ্য পরীক্ষামূলক; এটি দুর্দান্ত কাজ করে তবে কয়েকটি গৌণ প্রসাধনী ডাউনসাইড রয়েছে যেমন বিকল্পের বর্ণনায় বর্ণিত হয়েছে। আমি তবুও এটি একটি ধারণা হিসাবে যুক্ত ।
একটি মন্তব্যে যেমন পরামর্শ দেওয়া হয়েছে, অ-ওভারল্যাপিং পদ্ধতিতে উইন্ডোগুলি স্বয়ংক্রিয়ভাবে ছড়িয়ে পড়া আমার কাছে ব্যবহারিক ধারণা বলে মনে হচ্ছে না; আপনি যদি কোনও (অ্যাপ্লিকেশন-ভিত্তিক) গোষ্ঠীযুক্ত উইন্ডো সেটআপে কাজ করেন তবে স্ক্রিপ্টটি অযাচিতভাবে উইন্ডোগুলিকে পুনরায় সাজিয়ে তুলবে।
কিভাবে ব্যবহার করে
সমস্ত বিকল্পের জন্য আপনার প্রয়োজন:
wmctrl
এটি এখনও আপনার সিস্টেমে না থাকলে ইনস্টল করুন:
sudo apt-get install wmctrl
তৈরি করুন, এটি এখনও উপস্থিত না থাকলে ডিরেক্টরি:
~/bin
(ব্যাখ্যা: ডিরেক্টরিটি ~/bin
$ PATH এ রয়েছে, সুতরাং আপনি তাদের নামে এক্সিকিউটেবল চালাতে পারেন)
বিকল্পটির সাথে সম্পর্কিত স্ক্রিপ্টটি অনুলিপি করুন, এটিকে একটি ফাঁকা ফাইলে আটকে দিন, এটি raise_app
কোনও (কোনও এক্সটেনশন নয়) হিসাবে সংরক্ষণ করুন ~/bin
এবং সম্পাদনযোগ্য করুন
পৃথক বিকল্পে, সম্ভাব্য অতিরিক্ত পদক্ষেপগুলি ব্যাখ্যা করা হবে।
বিকল্প 1: এক বা একাধিক অক্ষর প্রবেশ করে অ্যাপ্লিকেশনটি চয়ন করুন
- একটি কী সমন্বয় টিপুন, একটি
zenity
উইন্ডো প্রদর্শিত হবে appear
- প্রবেশের বাক্সে অ্যাপ্লিকেশনটির নামের এক বা একাধিক অক্ষর প্রবেশ করান
- এন্টার চাপুন
এটি ম্যাচিং অ্যাপ্লিকেশনের সমস্ত উইন্ডোকে ( বর্তমান ভিউপোর্টে) সামনে এনে দেবে ।
gnome-terminal
বর্তমান ভিউপোর্টে সমস্ত উইন্ডো উত্থাপন করুন:
কিভাবে ব্যবহার করে:
- "কীভাবে ব্যবহার করবেন" বর্ণিত সেট আপ করুন
কমান্ড দ্বারা এটি পরীক্ষা করুন:
raise_app
যদি সমস্ত ঠিকঠাক কাজ করে তবে এটিকে আপনার পছন্দের শর্টকাট কী সংমিশ্রণে যুক্ত করুন: চয়ন করুন: সিস্টেম সেটিংস> "কীবোর্ড"> "শর্টকাট"> "কাস্টম শর্টকাট"। "+" ক্লিক করুন এবং কমান্ডটি যুক্ত করুন
এই পান্ডুলিপি:
#!/usr/bin/env python3
import subprocess
import getpass
def get(command):
return subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")
def execute(command):
subprocess.Popen(["/bin/bash", "-c", command])
# calculate screen resolution
res_output = get("xrandr").split(); idf = res_output.index("current")
res = (int(res_output[idf+1]), int(res_output[idf+3].replace(",", "")))
# creating window list on current viewport / id's / application names
w_data = [l.split()[0:7] for l in get("wmctrl -lpG").splitlines()]
windows = [[get("ps -u "+getpass.getuser()+" | grep "+w[2]).split()[-1], w[0]]
for w in w_data if 0 < int(w[3]) < res[0] and 0 < int(w[4]) < res[1]]
# ask user for first characters
try:
arg = get('zenity --entry --text "first characters" --title "application"').strip()
except subprocess.CalledProcessError:
pass
# raise matching windows
try:
[execute("wmctrl -ia "+item[1]) for item in windows if item[0].startswith(arg)]
except (subprocess.CalledProcessError, NameError):
pass
বিকল্প 2: অ্যাপ্লিকেশনগুলির মাধ্যমে চক্র এবং একটি কী সংমিশ্রণে তাদের উইন্ডোগুলি বাড়িয়ে তুলুন:
আসুন আমি একটি কী সমন্বয় অধীনে নিচে স্ক্রিপ্ট আছে Alt+ + 1। আমার বেশ কয়েকটি উইন্ডো খোলা আছে:
- ফায়ারফক্স
- জিনোম-টার্মিনাল
- Nautilus
বর্তমান অবস্থা:
আমি একবার Alt+ টিপুন 1, সমস্ত nautilus
উইন্ডো উত্থাপিত হয়েছে:
আমি আবার Alt+ টিপুন 1, সমস্ত firefox
উইন্ডো উত্থাপিত হয়েছে:
আমি আবার Alt+ টিপুন 1, সমস্ত gnome-terminal
উইন্ডো আবার উত্থিত হয়েছে, চক্রটি আবার শুরু হবে:
কিভাবে ব্যবহার করে
তারপরে আপনার কী সংমিশ্রণ সহ গ্রুপযুক্ত অ্যাপ্লিকেশন উইন্ডো সহ আপনার অ্যাপ্লিকেশনগুলির মধ্য দিয়ে চক্র করুন।
এই পান্ডুলিপি:
#!/usr/bin/env python3
import subprocess
import getpass
include_single = True # set to False if you only want to cycle through apps with multiple windows
def get(command):
return subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")
def execute(command):
subprocess.Popen(["/bin/bash", "-c", command])
def get_frontmost():
cmd = "xprop -root"
frontmost = [l for l in get(cmd).splitlines() if\
"ACTIVE_WINDOW(WINDOW)" in l][0].split()[-1]
return frontmost[:2]+"0"+frontmost[2:]
# calculate screen resolution
res_output = get("xrandr").split(); idf = res_output.index("current")
res = (int(res_output[idf+1]), int(res_output[idf+3].replace(",", "")))
# creating window list on current viewport / id's / application names
w_data = [l.split()[0:7] for l in get("wmctrl -lpG").splitlines()]
windows = [[get("ps -u "+getpass.getuser()+" | grep "+w[2]).split()[-1], w[0]]
for w in w_data if 0 < int(w[3]) < res[0] and 0 < int(w[4]) < res[1]]
# create application list to cycle through
if include_single == False:
pre = [it[0] for it in windows]
apps = sorted(list(set([it for it in pre if pre.count(it) > 1])))
else:
apps = sorted(list(set([it[0] for it in windows])))
if len(apps) == 0:
pass
else:
# get the frontmost window as a last itm in the cycle
front = get_frontmost()
front_pid = [l.split()[2] for l in get("wmctrl -lp").splitlines() if front in l][0]
last_infront = get("ps -u "+getpass.getuser()+" | grep "+front_pid).split()[-1]
# determine next apllication to raise
if not last_infront in apps or last_infront == apps[-1]:
arg = apps[0]
print(arg)
else:
arg = apps[apps.index(last_infront)+1]
# raise matching windows
try:
[execute("wmctrl -ia "+item[1]) for item in windows if item[0] == arg]
except (subprocess.CalledProcessError, NameError):
pass
বিকল্প 3: কী সংমিশ্রণ টিপুন + বর্তমান ভিউপোর্টে সমস্ত উইন্ডো বাড়াতে লঞ্চার আইকন -বা- অ্যাপ্লিকেশন উইন্ডোটিতে ক্লিক করুন
এটি সম্ভবত বিকল্প / প্রশ্ন / মন্তব্যে বর্ণিত বিষয়গুলির সবচেয়ে কাছাকাছি।
ধরা যাক আমার কাছে একটি অগোছালো ডেস্কটপ রয়েছে যা nautilus
অন্য উইন্ডোগুলির নীচে তিনটি উইন্ডো সমাহিত।
সমস্ত নটিলাস উইন্ডো উত্থাপন করতে (উদাহরণস্বরূপ শর্টকাট: Alt+ 1):
কিভাবে ব্যবহার করে:
- "কীভাবে ব্যবহার করবেন" বর্ণিত সেট আপ করুন
কমান্ড দ্বারা এটি পরীক্ষা করুন:
raise_app
যদি সমস্ত ঠিকঠাক কাজ করে তবে এটিকে আপনার পছন্দের শর্টকাট কী সংমিশ্রণে যুক্ত করুন: চয়ন করুন: সিস্টেম সেটিংস> "কীবোর্ড"> "শর্টকাট"> "কাস্টম শর্টকাট"। "+" ক্লিক করুন এবং কমান্ডটি যুক্ত করুন
তারপর:
এই পান্ডুলিপি
#!/usr/bin/env python3
import subprocess
import getpass
import time
def get(command):
return subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")
def execute(command):
subprocess.Popen(["/bin/bash", "-c", command])
def get_frontmost():
cmd = "xprop -root"
frontmost = [l for l in get(cmd).splitlines() if\
"ACTIVE_WINDOW(WINDOW)" in l][0].split()[-1]
return frontmost[:2]+"0"+frontmost[2:]
# calculate screen resolution
res_output = get("xrandr").split(); idf = res_output.index("current")
res = (int(res_output[idf+1]), int(res_output[idf+3].replace(",", "")))
# get window data for various purposes
w_data = get("wmctrl -lpG").splitlines()
non_windows = sum([[l.split()[0] for l in w_data if it in l]\
for it in ("unity-launcher", "unity-panel", "unity-dash", "Hud")], [])
# get id of current window
curr_window = get_frontmost()
# user gets 3 seconds to pick an application window (or launcher icon)
t = 0
while t < 4:
w_id1 = get_frontmost()
time.sleep(1)
w_id2 = get_frontmost()
if w_id1 == w_id2 or w_id2 in non_windows+[curr_window]:
t = t+1
else:
new_frontmost = w_id2
break
# raise
try:
pid = [l.split()[2] for l in w_data if new_frontmost in l]
wl_data = [l.split() for l in w_data]
raise_windows = [l[0] for l in wl_data if pid[0] == l[2] and\
0 < int(l[3]) < res[0] and 0 < int(l[4]) < res[1]]
[execute("wmctrl -ia "+item) for item in raise_windows]
except NameError:
pass
বিকল্প 4: একটি কী সংমিশ্রণ একটি বিকল্প তালিকা কল করে, বর্তমান ভিউপোর্টে অ্যাপ্লিকেশন অনুসারে উইন্ডোগুলির সংখ্যা দেখায়
এইটি আরও সুবিধাজনক হয়ে উঠল তখন আমি ধরে নিয়েছিলাম:
(আবার উদাহরণস্বরূপ) কী সংমিশ্রণ Alt+ টিপলে 1একটি zenity
উইন্ডো কল করে , সমস্ত অ্যাপ্লিকেশন এবং তাদের উইন্ডোর সংখ্যা বর্তমান ভিউপোর্টে তালিকাবদ্ধ করুন:
কেবল ▴বা ▾তীরগুলি টিপলে আপনি ডান বিকল্পটিতে নিয়ে আসবেন। টিপুন Enterএবং নির্বাচিত অ্যাপ্লিকেশনটির সমস্ত উইন্ডো উত্থাপিত হয়।
কিভাবে ব্যবহার করে:
- "কীভাবে ব্যবহার করবেন" বর্ণিত সেট আপ করুন
কমান্ড দ্বারা এটি পরীক্ষা করুন:
raise_app
যদি সমস্ত ঠিকঠাক কাজ করে তবে এটিকে আপনার পছন্দের শর্টকাট কী সংমিশ্রণে যুক্ত করুন: চয়ন করুন: সিস্টেম সেটিংস> "কীবোর্ড"> "শর্টকাট"> "কাস্টম শর্টকাট"। "+" ক্লিক করুন এবং কমান্ডটি যুক্ত করুন
এই পান্ডুলিপি
#!/usr/bin/env python3
import subprocess
import getpass
def get(command):
return subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")
def execute(command):
subprocess.Popen(["/bin/bash", "-c", command])
# calculate screen resolution
res_output = get("xrandr").split(); idf = res_output.index("current")
res = (int(res_output[idf+1]), int(res_output[idf+3].replace(",", "")))
# creating window list on current viewport / id's / application names
w_data = [l.split()[0:7] for l in get("wmctrl -lpG").splitlines()]
windows = [[get("ps -u "+getpass.getuser()+" | grep "+w[2]).split()[-1], w[0]]
for w in w_data if 0 < int(w[3]) < res[0] and 0 < int(w[4]) < res[1]]
# preparing zenity optionlist
apps = [item[0] for item in windows]
# prevent multiple zenity windows
if apps.count("zenity") > 1:
pass
elif apps.count("zenity") > 0:
execute('zenity --info --text "Another Zenity window is open already"')
# preventing empty windowlist
elif len(apps) > 0:
applist = [[app, str(apps.count(app))] for app in set(apps)]
applist.sort(key=lambda x: x[1])
# calling zenity window
try:
arg = get('zenity --list --text "Choose an application" '+\
'--title "Current windows" '+\
'--column "application" '+\
'--column "windows" '+\
'--height 250 '+\
'--width 250 '+\
(" ").join(sum(applist, [])))
except subprocess.CalledProcessError:
pass
# raise matching windows
try:
[execute("wmctrl -ia "+item[1]) \
for item in windows if arg.startswith(item[0])]
except (subprocess.CalledProcessError, NameError):
pass
else:
execute('zenity --info --text "No windows to list"')
বিকল্প 5: একটি লঞ্চ আইকন থেকে চলমান অ্যাপ্লিকেশনগুলির উইন্ডো উত্থাপন করুন
এই তালিকায় বর্তমানে একটি দ্রুত তালিকায় চলমান অ্যাপ্লিকেশনগুলির সাথে একটি লঞ্চার আইকন উপস্থিত রয়েছে। একটি চয়ন করুন, এবং অ্যাপ্লিকেশনগুলির সমস্ত উইন্ডো উত্থাপিত হবে।
চলমান অ্যাপ্লিকেশনগুলির তালিকা (বর্তমান ভিউপোর্টে) পরিবর্তিত হলে লঞ্চারটি স্বয়ংক্রিয়ভাবে আপডেট হয়। দ্রুত তালিকাটি অন্যান্য ভিউপোর্টগুলিতে আলাদা তালিকা দেখায়, যেখানে অন্যান্য অ্যাপ্লিকেশনগুলির উইন্ডোগুলি খোলা হয় (অভিযোজিত হতে 1-2 সেকেন্ড সময় লাগবে)।
উল্লিখিত হিসাবে, যদিও সম্পূর্ণরূপে কার্যকরী, এই বিকল্পটি ধারণা হিসাবে একটি উপায় । এটির মতো কয়েকটি গৌণ প্রসাধনী ডাউনসাইড রয়েছে। সবচেয়ে গুরুত্বপূর্ণ:
- কার্সার "চাকা" একটি ক্রিয়া পরে কয়েক সেকেন্ডের জন্য স্পিনিং করে রাখে। যদিও এটি কার্যকারিতা প্রভাবিত করে না, এটি কসমেটিক ডাউনসাইড।
- চলমান অ্যাপ্লিকেশন পরিবর্তনের তালিকার পরে লঞ্চ আইকনে অ্যাপ্লিকেশন তালিকার জন্য আপডেট হতে 1-2 সেকেন্ড সময় নেয়।
তবুও সেটআপটি কিছুটা জটিল (যদিও নীচে বিস্তারিতভাবে ব্যাখ্যা করা হয়েছে):
কিভাবে ব্যবহার করে
নীচে আপনি পাবেন:
দুটি স্ক্রিপ্ট / একটি আইকন / একটি .desktop
ফাইল
- , "কিভাবে ব্যবহার করতে" হিসেবে সেটআপ প্রস্তুত সংরক্ষণ প্রথম (main-) স্ক্রিপ্ট হিসাবে
raise_app
মধ্যে~/bin
নীচের আইকনটি সংরক্ষণ করুন (ডান ক্লিক করুন, হিসাবে সংরক্ষণ করুন) as raise.png
.desktop
খালি ফাইলটিতে ফাইলটি অনুলিপি করুন, লাইনটি সম্পাদনা করুন
Icon=/path/to/raise.png
আইকনের বাস্তব পথে (উদ্ধৃতি মধ্যে শূণ্যস্থান সঙ্গে পাথ)
হিসাবে এটি সংরক্ষণ raise.desktop
মধ্যে~/.local/share/applications
এটি যুক্ত করতে .desktop
ফাইলটিকে লঞ্চারে টেনে আনুন
- দ্বিতীয় স্ক্রিপ্ট কপি, এটি একটি খালি ফাইল পেস্ট, যেমন এটি সংরক্ষণ
update_apps
মধ্যে ~/bin
, এটা এক্সিকিউটেবল ভুলবেন না।
আপনার প্রারম্ভিক অ্যাপ্লিকেশনগুলিতে নিম্নলিখিত কমান্ডটি যুক্ত করুন (ড্যাশ> স্টার্টআপ অ্যাপ্লিকেশন> যোগ করুন):
update_apps
- এটি কাজ করতে লগ আউট এবং পিছনে প্রবেশ করুন।
প্রথম লিপি
#!/usr/bin/env python3
import subprocess
import getpass
import sys
arg = sys.argv[1]
def get(command):
return subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")
def execute(command):
subprocess.Popen(["/bin/bash", "-c", command])
# calculate screen resolution
res_output = get("xrandr").split(); idf = res_output.index("current")
res = (int(res_output[idf+1]), int(res_output[idf+3].replace(",", "")))
# creating window list on current viewport / id's / application names
w_data = [l.split()[0:7] for l in get("wmctrl -lpG").splitlines()]
windows = [[get("ps -u "+getpass.getuser()+" | grep "+w[2]).split()[-1], w[0]]
for w in w_data if 0 < int(w[3]) < res[0] and 0 < int(w[4]) < res[1]]
try:
[execute("wmctrl -ia "+item[1]) for item in windows if item[0].startswith(arg)]
except (subprocess.CalledProcessError, NameError):
pass
দ্বিতীয় লিপি
#!/usr/bin/env python3
import subprocess
import getpass
import time
import os
dtfile = os.environ["HOME"]+"/.local/share/applications/raise.desktop"
def get(command):
return subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")
def execute(command):
subprocess.Popen(["/bin/bash", "-c", command])
# calculate screen resolution
res_output = get("xrandr").split(); idf = res_output.index("current")
res = (int(res_output[idf+1]), int(res_output[idf+3].replace(",", "")))
# creating window list on current viewport / id's / application names
def applist():
try:
w_data = [l.split()[0:7] for l in get("wmctrl -lpG").splitlines()]
windows = [[get("ps -u "+getpass.getuser()+" | grep "+w[2]).split()[-1], w[0]]
for w in w_data if 0 < int(w[3]) < res[0] and 0 < int(w[4]) < res[1]]
except subprocess.CalledProcessError:
return []
else:
return set([app[0] for app in windows])
def update_dtfile(applications, text):
actionline = "Actions="+(";").join(applications)+";\n"
with open(dtfile) as src:
lines = src.readlines()
lines = lines[:[i for i in range(len(lines)) \
if lines[i].startswith("Actions=")][0]]+[actionline]
for item in text:
for it in item:
lines.append(it)
with open(dtfile, "wt") as out:
for line in lines:
out.write(line)
while True:
apps1 = applist()
time.sleep(1)
apps2 = applist()
if apps1 != apps2:
text = [["[Desktop Action "+it+"]\n", "Name="+it+"\n",
"Exec=raise_app "+it+"\n", "OnlyShowIn=Unity;\n\n",
]for it in apps2]
update_dtfile(apps2, text)
.ডেস্কটপ ফাইল
[Desktop Entry]
Name=Raise application windows
Comment=Raise groups of windows
Icon=/path/to/raise.png
Terminal=false
Type=Application
Version=1.0
Actions=
সংক্ষিপ্ত বর্ণনা
উপরের সমস্ত সমাধান কমান্ডটি wmctrl
ব্যবহার করে উইন্ডো তালিকা তৈরি করতে ব্যবহার করে wmctrl -lpG
। এই কমান্ডটি লাইন তৈরি করে, যেমনটি দেখায়:
0x044000b3 0 3429 65 24 1615 1026 jacob-System-Product-Name unity - How to show all windows of an application? - Ask Ubuntu - Mozilla Firefox
এই লাইনের মধ্যে রয়েছে:
- প্রথম কলাম: উইন্ডোর আইডি (আমরা এটি বাড়াতে ব্যবহার করতে পারি)
- তৃতীয় কলাম: উইন্ডোটির মালিকানাধীন পিড।
- চতুর্থ / ৫ ম কলাম: উইন্ডোটির জ্যামিতি এক্সওয়াই (যে আমরা উইন্ডোটি বর্তমান ভিউপোর্টে রয়েছে কিনা তা দেখতে ব্যবহার করি, আইকিডাব্লু
xrandr
)
ps -u <username>
অ্যাপ্লিকেশনটির একটি "ব্যবহারকারী-পঠনযোগ্য" সনাক্তকরণ (নাম) পেতে আউটপুটটিতে পিডটি সন্ধান করা হয়েছে ।
এইভাবে আমরা অ্যাপ্লিকেশনগুলিতে উইন্ডোজ বরাদ্দ করতে পারি। পরবর্তীকালে আমরা for
কমান্ডটি দিয়ে একটি প্রদত্ত অ্যাপ্লিকেশনটির উইন্ডোগুলি লুপে বাড়াতে পারি wmctrl -ia
।
অপশন 3-
এ স্ক্রিপ্টটি 3-সেকেন্ডের "ওয়েটিং" লুপটি শুরু করে, xprop -root
বারবার কমান্ডটি ব্যবহার করে সামনেরতম উইন্ডোটির কোনও পরিবর্তন আছে কিনা তা দেখার জন্য; ব্যবহারকারী যদি কোনও অ্যাপ্লিকেশনটির উইন্ডো বাড়াতে লঞ্চার আইকনে ক্লিক করেন বা সরাসরি একটি উইন্ডোতে ক্লিক করেন তবে এটি ঘটবে। যদি তা হয়, তবে লুপটি ভেঙে "নতুন" সম্মুখতম অ্যাপ্লিকেশনটি অনুসন্ধান করে এবং পরবর্তীকালে সেই অ্যাপ্লিকেশনটির অন্যান্য সমস্ত উইন্ডো উত্থাপন করে।