อัปเดต 7 เมษายน: มีการเพิ่มและค้นพบเวอร์ชั่นอัลเบิร์ตที่แตกต่างกันไปดูการอัปเดตและการร้องโบนัส !!!
เกี่ยวกับการทำงานของเส้นประ : คุณได้ถามว่า " มีการเปลี่ยนแปลงพฤติกรรมเริ่มต้นของตัวเรียกใช้เพื่อตรวจสอบเรื่องนี้ก่อนที่จะเปิดหน้าต่างใหม่หรือไม่ " คำตอบพื้นฐานคือไม่เป็นผู้ใช้ทั่วไปที่คุณไม่มีวิธีเพิ่มพฤติกรรมดังกล่าวเพื่อขีด อย่างไรก็ตามหากมีผู้พัฒนาขอบเขตความสามัคคีที่ยินดีที่จะนำไปใช้คุณอาจเข้าหาพวกเขาหรือพัฒนาด้วยตัวคุณเองถ้าคุณมีความตั้งใจและเต็มใจที่จะเรียนรู้ ทักษะการเขียนโค้ดของฉันค่อนข้างเรียบง่ายดังนั้นฉันจึงใช้การเขียนสคริปต์เปลือกและส่วนหน้าแบบกราฟิกที่มีอยู่สำหรับสคริปต์เป็นวิธีแก้ปัญหา
ข้อมูลที่เกี่ยวข้อง
โพสต์ต้นฉบับ:
ฉันได้เขียนสคริปต์ที่ใช้บทสนทนา zenity และ wmctrl เพื่อให้ได้สิ่งที่คุณต้องการ โปรดสังเกตว่านี่เป็นสคริปต์กราฟิกซึ่งหมายความว่ามันจะทำงานได้เฉพาะกับ Windows ใน GUI และจะไม่ทำงานหากคุณพยายามเปิดบางสิ่งด้วย tty นอกจากนี้จากสิ่งที่ฉันเข้าใจอัลเฟรดทำสิ่งเดียวกัน คุณสามารถสร้างทางลัดบนเดสก์ท็อปให้กับมันหรือทางลัดของตัวเรียกใช้งานตามที่อธิบายไว้ที่นี่และที่นี่ที่นี่
บท:
#!/bin/bash
# Author: Serg Kolo
# Description: A launcher script that checks whether
# or not a window of a particular program already exists
# If a window of such program is open, bring it to focus
# Otherwise - launch a new window
# Written for /ubuntu//q/440142/295286
# Date: April 6 , 2015
#
MYPROG=$( zenity --entry --title='MY LAUNCHER' --text='Type the name of application to run' )
sleep 0.5
wmctrl -lx | awk '{print $3}' | grep -i "$MYPROG"
if [ $? -eq 0 ]; then
sleep 1
wmctrl -xa $MYPROG
#as an alternative try the line bellow
#wmctrl -a $MYPROG
exit 1
else
$MYPROG &
exit 0
fi
หมายเหตุด้านข้าง:ในเวอร์ชันก่อนหน้าสคริปต์ใช้ echo $ เพื่อทดสอบว่านิพจน์ก่อนหน้านี้ออกมาสำเร็จหรือไม่ ตามคำแนะนำของ muru (จากการแก้ไข) ฉันเปลี่ยนรหัสเป็นรุ่นที่กะทัดรัดกว่าดังนั้นฉันขอแนะนำให้คุณดูที่เวอร์ชันก่อนหน้าและปัจจุบัน
ก่อนหน้านี้wmctrl -a $MYPROG
ไม่ทำงานกับการทดสอบ google-chrome หรือโครเมียมเบราว์เซอร์ ด้วยเหตุผลโง่ ๆ บางโปรแกรมมีคุณสมบัติ WM_CLASS ของหน้าต่างที่เป็นตัวพิมพ์ใหญ่ในขณะที่โปรแกรมตามที่ระบุไว้dpkg --get-selections
เป็นตัวพิมพ์เล็ก (เพียงแค่อ่านman wmctrl
และเรียกใช้wmctrl -lx
คุณจะรู้) การเพิ่ม -ax นั้นควรดูแลสิ่งนี้ สคริปต์แสดงหน้าต่างโครเมียมที่เปิดอยู่แล้วตามที่ควรจะเป็น
สิ่งอื่น - wmctlr ค่อนข้างแปลกที่มันต้องการความล่าช้าบางครั้ง (มีประสบการณ์กับมันในสคริปต์อื่น) ดังนั้นฉันต้องเพิ่มsleep 1
บรรทัด ก่อนหน้านี้จะเป็นการเปิดและปิดด้วย firefox แต่ตอนนี้ทำงานได้ว่ายน้ำ
สคริปต์ที่ใช้งานจริง
ในแอนิเมชั่นเบลล์คุณจะเห็นว่าในการเรียกใช้ครั้งแรกของสคริปต์มีอินสแตนซ์หนึ่งของ firefox ที่เปิดอยู่และสคริปต์จะสลับโฟกัสไปที่หน้าต่างนั้น ในการทดสอบครั้งที่สองฉันเปิดอินสแตนซ์ใหม่ของ google-chrome ซึ่งไม่ได้เปิดไว้ก่อนหน้านี้ (หมายเหตุด้านข้าง: หากคุณมีความรู้เกี่ยวกับเดสก์ท็อปอยู่แล้วนั่นคือ openbox พร้อมท่า cairo)
ตามคำแนะนำในความคิดเห็นการลบภาพเคลื่อนไหวที่ฝังจะถูกลิงค์เท่านั้น รายงานว่ามันเสียโปรด!
http://i.stack.imgur.com/puuPZ.gif
อัปเดต 7 เมษายน
ฉันปรับปรุงสคริปต์บ้างเพื่อให้โปรแกรมทั้งหมดที่แสดงอยู่ในกล่องรายการแบบหล่นลงของ zenity ตอนนี้ผู้ใช้ไม่ต้องจดจำแต่ละโปรแกรม แต่สามารถเลื่อนดูรายการโดยใช้ปุ่มลูกศรหรือเพียงแค่เปิดเมนูแบบเลื่อนลง นอกจากนี้เวอร์ชันที่ได้รับการปรับปรุงนี้จะเพิ่มหน้าต่างไม่ใช่ชื่อ แต่ตามรหัสหน้าต่างซึ่งให้ประสิทธิภาพที่ดีกว่ามาก โปรดทราบว่าวิธีที่ฉันใช้งานไฟล์. เดสก์ท็อปนั้นซ้ำซ้อนใช้คำสั่ง cut สองครั้ง แต่เนื่องจากสคริปต์ของฉันไม่ดีเท่านี้ทั้งหมดนี้เป็นสิ่งที่ฉันทำได้ ข้อเสนอแนะสำหรับการปรับปรุงยินดีต้อนรับ!
#!/bin/bash
# Author: Serg Kolo
# Description: Second version of a launcher script that checks whether
# or not a window of a particular program already exists
# If a window of such program is open, bring it to focus
# Otherwise - launch a new window
# Written for /ubuntu//q/440142/295286
# Date: April 7 , 2015
#
set -x
MYPROG=$(zenity --entry --text 'Select program from list' --entry-text $(ls /usr/share/applications/*.desktop | cut -d'/' -f5 | cut -d'.' -f1 | xargs echo))
sleep 0.5
# Do we have a window of such program ?
wmctrl -lx| awk '{print $3}' | grep -i $MYPROG
if [ $? -eq 0 ]; then
sleep 0.5 # if yes, find that window id, and raise it
WINID=$(wmctrl -lx | grep -i $MYPROG | awk 'NR==1{print $1}')
wmctrl -ia $WINID &
# exit 0
else
echo $MYPROG | grep -i libreoffice
if [ $? -eq 0 ]
then
MYPROG=$(echo $MYPROG | sed 's/-/ --/g')
fi
$MYPROG &
# exit 0
fi
โบนัส:
ฉันได้พบอัลเบิร์ตซึ่งเป็นอัลเฟรดเวอร์ชันลีนุกซ์ แต่ไม่ได้ลองด้วยตัวเอง มูลค่าการตรวจสอบว่า อย่างไรก็ตามอย่างที่ยาโคบจดไว้แล้วมันก็ยังบั๊ก
มีแอปที่เรียกว่า Gnome-Do ซึ่งมีลักษณะกราฟิกที่คล้ายกับอัลเฟรดอย่างไรก็ตามมันไม่มีฟังก์ชันการทำงานเช่นเดียวกับสคริปต์นี้
แจ้งให้เราทราบหากคุณชอบสคริปต์นี้หากมีสิ่งใดที่ต้องแก้ไขและอย่าลืมโหวตคำตอบถ้าคุณเห็นว่ามีประโยชน์