ฉันจะค้นหาไฟล์ไอคอนที่ใช้โดยเมนูสถานะที่ไม่ใช่ค่าเริ่มต้น (ตัวบ่งชี้ aka) ได้อย่างไร


9

ฉันต้องการค้นหาตำแหน่งของไอคอนที่ใช้โดยเมนูสถานะที่ไม่ใช่ค่าเริ่มต้น(เรียกอีกอย่างว่าตัวบ่งชี้แอปพลิเคชันหรือตัวบ่งชี้แอปเพล็ต)

ป้อนคำอธิบายรูปภาพที่นี่

ไฟล์ภาพไอคอนเหล่านี้อยู่ที่ไหน

ในภาพหน้าจอของฉันฉันมี ownCloud และ Radiotray แต่ฉันต้องการคำตอบทั่วไปที่ไม่เฉพาะเจาะจงกับไอคอนเหล่านี้โดยเฉพาะโปรด ฉันไม่รู้ชื่อไฟล์หรือประเภทไฟล์ดังนั้นการค้นหายาก

คำตอบ:


9

ตำแหน่งเริ่มต้นสำหรับไอคอนตัวบ่งชี้ที่ไม่ใช่ค่าเริ่มต้นหรือไม่

ไม่มีตำแหน่งเริ่มต้นที่จัดเก็บไอคอนเหล่านี้ แอปพลิเคชันใด ๆ (-developer) สามารถเก็บไว้ในที่ที่เหมาะสม

อย่างไรก็ตามข่าวดีก็คือว่าตัวบ่งชี้มักจะไม่ติดตั้งรายการไฟล์และรูปภาพที่ไม่สิ้นสุด เราสามารถ จำกัด การค้นหาของเราโดย (นอกเหนือจากการมองเข้าไปในโค้ด) ดูที่ผลลัพธ์ของคำสั่ง:

dpkg-query -L <packagename>

ในตัวอย่างของฉัน

dpkg-query -L placesfiles

ป้อนคำอธิบายรูปภาพที่นี่

สิ่งนี้จะอยู่ในหมู่ผู้อื่นเอาท์พุทภาพต่อไปนี้:

/opt/placesfiles/images/dir_icon.png
/opt/placesfiles/images/placesfiles64.png
/usr/share/pixmaps/placesfiles.png

... ซึ่งจะทำให้การค้นหาค่อนข้าง จำกัด

จากมนุษย์dpkg-query:

   -l, --list [package-name-pattern...]
          List packages matching given pattern. If no package-name-pattern
          is  given,  list all packages in /var/lib/dpkg/status, excluding
          the ones marked as not-installed (i.e.  those  which  have  been
          previously purged). Normal shell wildcard characters are allowed
          in package-name-pattern. Please note you will probably  have  to
          quote  package-name-pattern to prevent the shell from performing
          filename expansion. For example this will list all package names
          starting with “libc6”:

ในกรณีของRadiotrayฉันพบ.pngไฟล์ต่อไปนี้(กำลังทำงานdpkg-query -L radiotray | grep png):

/usr/share/radiotray/images/radiotray_connecting.png
/usr/share/radiotray/images/radiotray_on.png
/usr/share/radiotray/images/radiotray_off.png
/usr/share/radiotray/images/radiotray.png
/usr/share/pixmaps/radiotray.png

หากเราต้องการค้นหาจริงๆให้ค้นหารหัส

... เราสามารถค้นหาไฟล์ที่ติดตั้ง (ภายใน) เพื่อดูรายการที่ตรงกันของสตริง "ไอคอน" ตัวบ่งชี้หลายตัวถูกเขียนในหนึ่งในภาษาสคริปต์ (เช่นpython) ซึ่งหมายความว่าพวกเขาสามารถค้นหาได้ดีมาก

ตัวอย่าง

อีกครั้งโดยใช้radiotrayตัวอย่าง

dpkg-query -L radiotray | xargs grep icon

ในผลลัพธ์เราพบ ao:

/usr/lib/python2.7/dist-packages/radiotray/SysTrayGui.py 
                 self.icon.set_from_file(APP_ICON_CONNECT)

เมื่อมองเข้าไปในไฟล์SysTrayGui.pyเราจะเห็น:

from lib.common import APPNAME, APPVERSION, APP_ICON_ON, APP_ICON_OFF, APP_ICON_CONNECT, APP_INDICATOR_ICON_ON, APP_INDICATOR_ICON_OFF

จากนี้เราสามารถสรุปได้ไอคอนดังกล่าวมีการกำหนดไว้ในโมดูลภายในไดเรกทอรีcommon (ย่อย) lib(ดูที่นี่วิธีที่หลามค้นพบโมดูลส่วนไดเรกทอรีย่อย )

ในโมดูลนี้เราสามารถอ่านหัวข้อ:

# Media path
if os.path.exists(os.path.abspath('../data/images/')):
    IMAGE_PATH = os.path.abspath('../data/images/')
else:
    IMAGE_PATH = '%s/%s/images' % (datadir, APPDIRNAME)

# Images
APP_ICON = os.path.join(IMAGE_PATH, 'radiotray.png')
APP_ICON_ON = os.path.join(IMAGE_PATH, 'radiotray_on.png')
APP_ICON_OFF = os.path.join(IMAGE_PATH, 'radiotray_off.png')
APP_ICON_CONNECT = os.path.join(IMAGE_PATH, 'radiotray_connecting.gif')
APP_INDICATOR_ICON_ON = "radiotray_on"
APP_INDICATOR_ICON_OFF = "radiotray_off"
APP_INDICATOR_ICON_CONNECT = "radiotray_connecting"

... และที่นี่เราอยู่ ...

สถานการณ์พิเศษ

ด้วยการใช้งานตัวชี้วัดทั้งหมดของฉันฉันสามารถหาไอคอนที่เกี่ยวข้องได้โดยใช้วิธีการด้านบน

จะกลายเป็นไปได้อย่างไรก็ตามในการรวบรวมภาพร่วมกับรหัสเป็นปฏิบัติการเดียว ไม่จำเป็นต้องอธิบายว่าในกรณีเช่นนี้คุณจะไม่พบภาพแยกต่างหากและคุณจะไม่สามารถแทนที่ได้โดยไม่ต้องแก้ไขโค้ดและคอมไพล์ใหม่

กรณีของ owncloud น่าจะเป็นกรณีเช่นนี้ โดยใช้วิธีการดังกล่าวข้างต้น (s) /usr/share/icons/hicolor/<size>/appsแสดงให้เห็นว่าชุดของไอคอนได้รับการติดตั้งอยู่ภายใน ไม่มีไอคอนเหล่านี้จะออกมาถูกนำมาใช้ แต่ในตัวบ่งชี้ในอูบุนตู

OP ค่อนข้างทำงานก่อน (และหลัง) เขาถามคำถามนี้ หนึ่งในนั้นคือการเรียกใช้:

gdbus call --session --dest com.canonical.indicator.application --object-path /com/canonical/indicator/application/service --method com.canonical.indicator.application.service.GetApplications

... ซึ่งทำให้เรามีข้อมูลที่เป็นประโยชน์บ้าง เอาท์พุทรวมส่วน:

('146028888067', 2, 'org.kde.StatusNotifierItem-22055-1', '/StatusNotifierItem/menu', '/tmp/iconcache-50ePXx', '', '', '', 'owncloud', 'ownCloud')

เมื่อมองเข้าไปในไดเรกทอรี/tmp/iconcache-50ePXxฉันพบไอคอนที่ถูกต้องซึ่งใช้โดยตัวบ่งชี้:

ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่

... ซึ่งดูเหมือนว่าจะพิสูจน์ไอคอนเหล่านี้ถูกสร้างขึ้นทันที ปิด owncloud ทำให้ไดเรกทอรีและไอคอนหายไป

เป็นไปได้ที่จะเปลี่ยนไอคอนของตัวบ่งชี้โดยแทนที่ไอคอนเหล่านี้:

ป้อนคำอธิบายรูปภาพที่นี่

ซึ่งพิสูจน์ได้ว่าสิ่งเหล่านี้เป็นไอคอนที่เรากำลังมองหา

ในการทำให้สิ่งที่ฉันทำด้วยตนเองเป็นแบบอัตโนมัติจะต้องมีสคริปต์ / wrapper เนื่องจากชื่อของไดเรกทอรีที่สร้างขึ้นจะเปลี่ยนไปทุกครั้งที่มีการเปิดตัวคลาวด์ ตัวเลือกที่สะดวกที่สุดแน่นอนว่ารหัสของลูกค้าจะเปลี่ยนไป

ดูเพิ่มเติมสนทนาของเราที่นี่

ยังมีต่อ...


ไม่ได้dpkg -Lทำในสิ่งเดียวกันได้หรือไม่
Kaz Wolfe

@KazWolfe เห็นได้ชัดว่านี่มันไม่ได้กล่าวถึงว่า: manpages.ubuntu.com/manpages/precise/man1/dpkg.1.html
จาค็อบ Vlijm

ขอบคุณสิ่งนี้มีประโยชน์สำหรับการค้นหาไอคอน Radiotray ฉันหลังจากที่ไอคอนขาวดำ ownCloud จากภาพหน้าจอของฉัน ( ตัวอย่างเช่นจากซอร์สโค้ด ownCloud บน GitHub ที่นี่ ) - dpkg-query -Lและมันไม่ได้เป็นหนึ่งผลลัพธ์ที่กลับมาพร้อมกับ การค้นหาด้วยfind / -name state-ok -type fรูปลักษณ์จะหยุดชะงัก แต่ฉันจะปล่อยให้มันทำงานข้ามคืน
Tom Brossman

@ TomBrossman ฉันแน่ใจว่าเราสามารถหาได้ ฉันจะติดตั้ง ownCloud เพื่อดู
Jacob Vlijm

1
@ TomBrossman เซิร์ฟเวอร์อาจหยุดให้ทำงานชั่วคราวฉันได้รับข้อผิดพลาด 404 - ไม่พบข้อผิดพลาดในบางส่วน .. ดูไฟล์. deb ที่ดาวน์โหลดมาเอง owncloud ติดตั้งไอคอนไว้/usr/share/icons/hicolor/<size>/apps บ้าง แต่น่าเสียดายที่ไฟล์ .deb ไม่ได้ติดตั้ง: Errors were encountered while processing:ผมจะลองอีกครั้งในภายหลัง ...
จาค็อบ Vlijm

4

ไอคอนและที่ตั้งที่มีศักยภาพ

ตัวบ่งชี้มีสองวิธีที่สามารถใช้ไอคอนได้:

  • ไอคอนที่กำหนดเอง สิ่งนี้มักจะเข้าสู่/usr/share/pixmaps/แม้ว่าผู้สร้างบางคนอาจส่งไอคอนตัวบ่งชี้ไปยังไดเรกทอรีอื่น Jacob Vlijm ซึ่งมีคำตอบอยู่ในหน้านี้และใครเป็นผู้เขียนตัวบ่งชี้ SpaceView เช่นเลือกที่จะวางไอคอนสำหรับตัวบ่งชี้/opt/spaceview/iconนั้น ด้วยไอคอนประเภทนี้จะยุ่งยากเล็กน้อย แต่ไม่ซับซ้อน - ใช้dpkg -L <package name>หรือcat /var/lib/dpkg/info/PACKAGE.listค้นหาไฟล์ไอคอนด้วย.pngหรือ.svgขยาย เหล่านี้เป็นเรื่องปกติมากที่สุด
  • ไอคอนมาตรฐานเฉพาะธีม โดยทั่วไปสามารถพบได้ใน/usr/share/iconsโฟลเดอร์ ตัวอย่างเช่นในตัวบ่งชี้ของฉันเช่นตัวบ่งชี้ Udisks ฉันมักจะพึ่งพาสิ่งที่อยู่ใน/usr/share/icons/gnomeเนื่องจากสิ่งเหล่านี้เป็นมาตรฐานและมาพร้อมกับการติดตั้ง Ubuntu ใด ๆ หากคุณไม่พบไอคอนจากการสอบถามdpkgโอกาสที่แพ็คเกจจะใช้ไอคอนมาตรฐาน

ไปที่แหล่งที่มา

หากตัวบ่งชี้ถูกเขียนใน Python หรือ Ruby การมองผ่านซอร์สโค้ดเพื่อหาเบาะแสนั้นค่อนข้างง่ายเนื่องจากเป็นสคริปต์และเพียงพอสำหรับgrepการค้นหาผ่านซอร์สโค้ด ภาษาที่คอมไพล์เช่น C และ Vala ไม่ได้มาพร้อมกับซอร์สโค้ดดังนั้นคุณจะต้องขอรับมันไม่ว่าจะผ่านapt-get source package-nameหรือจากที่ใดก็ตามที่คุณได้รับแพ็คเกจ (ผู้ใช้ที่ชอบผจญภัยสามารถใช้hexdumpหรือคอมไพล์ไฟล์ที่ปฏิบัติการได้ แต่ IMHO มันทำงานได้มากเกินไปสำหรับความอยากรู้อยากเห็นเกี่ยวกับไอคอน)

หมายเหตุ : หากไอคอนอยู่ในหนึ่งในไดเรกทอรีมาตรฐานเช่น/usr/share/icons/หรือ/usr/share/pixmapsผู้เขียนซอฟต์แวร์อาจเลือกที่จะเรียกไอคอนโดยใช้ชื่อโดยไม่มีส่วนขยาย ตัวอย่างเช่นในฉันudisks-indicatorฉันใช้สายนี้เพื่อเรียกไอคอนมาตรฐานอย่างใดอย่างหนึ่ง:

self.app.set_icon("drive-harddisk-symbolic")

สังเกตเห็นการขาด.svgหรือการ.pngขยาย ดังนั้นในกรณีนี้เรามีชื่อของไอคอนและเราสามารถค้นหาได้โดยใช้ลินุกซ์คำสั่งมาตรฐานเช่นหรือlocatefind

ค้นหาโดยใช้เครื่องมือ Linux มาตรฐาน

หากคุณต้องการมีคำสั่งสำหรับค้นหาไอคอนให้ใช้ชุดค่าผสมอย่างง่ายนี้:

dpkg -L <Package name here> | xargs file  | grep -i image

นี่คือตัวอย่าง ฉันรู้ว่าตัวบ่งชี้ diskman ใช้ไอคอนที่กำหนดเอง ดังนั้นคำสั่งนี้บอกอะไรเรา

$ dpkg -L indicator-diskman | xargs file  | grep -i image                                                                
/usr/share/indicator-diskman/images:                    directory
/usr/share/indicator-diskman/images/drive-harddisk.svg: SVG Scalable Vector Graphics image
/usr/share/indicator-diskman/images/media-optical.png:  PNG image data, 64 x 64, 8-bit/color RGBA, non-interlaced
/usr/share/indicator-diskman/images/disks.png:          PNG image data, 64 x 64, 8-bit gray+alpha, non-interlaced
/usr/share/indicator-diskman/images/locked.png:         PNG image data, 16 x 16, 8-bit/color RGBA, non-interlaced
/usr/share/indicator-diskman/images/lock.svg:           SVG Scalable Vector Graphics image
/usr/share/indicator-diskman/images/unlocked.png:       PNG image data, 16 x 16, 8-bit/color RGBA, non-interlaced
/usr/share/indicator-diskman/images/media-eject.svg:    SVG Scalable Vector Graphics image
/usr/share/indicator-diskman/images/disk.png:           PNG image data, 32 x 32, 8-bit/color RGBA, non-interlaced
/usr/share/pixmaps/indicator-diskman.png:               PNG image data, 64 x 64, 8-bit gray+alpha, non-interlaced

สังเกตุ/usr/share/pixmaps/indicator-diskman.pngภาพสุดท้ายซึ่งเป็นตัวบ่งชี้ที่แสดงบนพาเนล

และถ้าตัวบ่งชี้ใช้ไอคอนมาตรฐาน แน่นอนว่าจะไม่มีผลลัพธ์:

$ dpkg -L udisks-indicator | xargs file  | grep -i image                                                                 

$

ข้อสรุป

ในขณะที่ไม่มีมาตรฐานกำหนดมีชุดของสถานที่ทั่วไปที่ไอคอนไปและเราสามารถใช้dpkgเพื่อสอบถามข้อมูลเกี่ยวกับไฟล์ที่มาพร้อมกับแพคเกจเฉพาะแต่ละชุด สุดท้ายอาจไม่ใช่ข้อเสนอแนะด้านเทคนิค แต่ลองส่งอีเมลถึงผู้พัฒนาหรือหยุดโดย IRC หรือแชทของพวกเขาแล้วถามพวกเขาว่า "เฮ้ตัวบ่งชี้ของคุณใช้ไอคอนอะไร?" นักพัฒนามักจะดีใจที่ได้ยินจากผู้ที่ใช้ซอฟต์แวร์ของพวกเขาและไม่สนใจที่จะตอบคำถามด่วน


ขอบคุณคำตอบนี้มีประโยชน์มาก แต่การซิงค์เดสก์ท็อปของฉันเองด้วยการทำสิ่งแปลก ๆ กับไอคอนและฉันก็หวังว่าจะเข้าใจเช่นกัน
Tom Brossman

@ TomBrossman โดยทำสิ่งที่แปลกคุณหมายถึงอะไรกันแน่?
Sergiy Kolodyazhnyy

แอปพลิเคชัน Desktop Sync ของ ownCloud จะติดตั้งช่วงของไอคอนที่ไม่ได้ใช้ ฉันหวังว่าจะปรับแต่งและแทนที่พวกเขา แต่เนื่องจากมันสร้างพวกเขาได้ทันที/tmpมันไม่สามารถใช้งานได้จริง การปรับแต่งพวกเขาสำหรับแอพพลิเคชั่นส่วนใหญ่นั้นใช้คำตอบของคุณได้ง่ายเพราะพวกเขาใช้ชุดไอคอนที่ติดตั้งไว้
Tom Brossman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.