Làm cách nào để tìm các tệp biểu tượng được sử dụng bởi các menu trạng thái không mặc định (còn gọi là chỉ báo)?


9

Tôi muốn tìm vị trí của các biểu tượng được sử dụng bởi một số menu trạng thái không mặc định (còn được gọi là các chỉ báo ứng dụng hoặc các applet chỉ báo).

nhập mô tả hình ảnh ở đây

Những tập tin hình ảnh biểu tượng nằm ở đâu?

Trong ảnh chụp màn hình của tôi, tôi có ownCloud và Radiotray, nhưng tôi muốn một câu trả lời chung không cụ thể cho các biểu tượng cụ thể này. Tôi không biết tên tệp hoặc loại tệp nên việc tìm kiếm rất khó khăn.

Câu trả lời:


9

Vị trí mặc định cho các biểu tượng chỉ báo không mặc định?

Không có vị trí mặc định nơi các biểu tượng này được lưu trữ. Bất kỳ ứng dụng nào (nhà phát triển) có thể lưu trữ chúng ở nơi được coi là phù hợp.

Tuy nhiên , tin tốt là các chỉ số thường không cài đặt danh sách vô tận các tệp và hình ảnh. Chúng ta có thể giới hạn tìm kiếm của mình bằng cách (ngoài việc nhìn vào mã) nhìn vào đầu ra của lệnh:

dpkg-query -L <packagename>

Trong ví dụ của tôi về

dpkg-query -L placesfiles

nhập mô tả hình ảnh ở đây

điều này sẽ trong số những người khác, xuất ra các hình ảnh sau đây:

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

... Điều đó sẽ làm cho việc tìm kiếm khá hạn chế.

Từ người đàn ông 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”:

Trong trường hợp của Radiotray , tôi đã tìm thấy các .pngtệp sau (đang chạy 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

Nếu chúng ta thực sự cần tìm hiểu, tìm kiếm mã

... Chúng ta có thể xem qua (bên trong) các tệp đã cài đặt để tìm các kết quả của chuỗi "biểu tượng". Nhiều chỉ số được viết bằng một trong các ngôn ngữ script (như python), có nghĩa là chúng có khả năng tìm kiếm rất tốt.

Một ví dụ

Một lần nữa sử dụng radiotrayví dụ

dpkg-query -L radiotray | xargs grep icon

Trong đầu ra, chúng tôi tìm thấy áo:

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

Nhìn vào tập tin SysTrayGui.py, chúng ta có thể thấy:

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

Từ đó, chúng ta có thể kết luận các biểu tượng được đề cập được xác định trong mô-đun commonbên trong thư mục (phụ) lib. (Xem ở đây làm thế nào python tìm thấy nó các mô-đun, phần Subdirectories )

Trong mô-đun này, chúng ta có thể đọc phần:

# 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"

... và ở đây chúng tôi ...

Tình huống đặc biệt

Với thực tế tất cả các chỉ số của mình, tôi đã tìm được các biểu tượng tương ứng bằng cách sử dụng (các) phương pháp ở trên.

Tuy nhiên, hóa ra là có thể, để biên dịch hình ảnh cùng với mã thành một tệp thực thi duy nhất. Không cần phải giải thích rằng trong những trường hợp như vậy, bạn sẽ không tìm thấy một hình ảnh riêng biệt, bạn cũng không thể thay thế chúng mà không cần chỉnh sửa mã và biên dịch lại.

Trường hợp của owncloud dường như là một trường hợp như vậy. Sử dụng (các) phương pháp trên cho thấy một tập hợp các biểu tượng đã được cài đặt bên trong /usr/share/icons/hicolor/<size>/apps. Không có biểu tượng nào trong số này hóa ra được sử dụng tuy nhiên trong chỉ báo trên ubfox .

OP đã làm một số công việc trước đó (và sau đó), anh ấy đã hỏi câu hỏi này. Một trong số đó là chạy:

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

... cung cấp cho chúng tôi một số thông tin hữu ích. Đầu ra bao gồm một phần:

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

Nhìn vào thư mục /tmp/iconcache-50ePXx, tôi thấy các biểu tượng chính xác được sử dụng bởi chỉ báo:

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

... dường như chứng minh những biểu tượng này được tạo ra một cách nhanh chóng; đóng owncloud làm cho thư mục và các biểu tượng của nó biến mất.

Hóa ra có thể thay đổi biểu tượng của chỉ báo bằng cách thay thế các biểu tượng này:

nhập mô tả hình ảnh ở đây

điều đó chứng tỏ đây thực sự là những biểu tượng mà chúng tôi đang tìm kiếm.

Tuy nhiên, để tự động hóa những gì tôi đã làm thủ công, sẽ cần một tập lệnh / trình bao bọc, vì tên thư mục đã tạo được thay đổi mỗi khi owncloud được khởi chạy. Tất nhiên, tùy chọn thuận tiện nhất sẽ là mã của máy khách riêng sẽ được thay đổi.

Xem thêm thảo luận của chúng tôi ở đây .

Còn tiếp...


Không dpkg -Llàm điều tương tự?
Kaz Wolfe

@KazWolfe rõ ràng, ở đây nó không được đề cập mặc dù: manpages.ubuntu.com/manpages/precise/man1/dpkg.1.html
Jacob Vlijm

Cảm ơn, điều này rất hữu ích cho việc tìm kiếm các biểu tượng Radiotray. Tôi đang theo biểu tượng đơn sắc của ownCloud từ ảnh chụp màn hình của mình ( ví dụ từ mã nguồn ownCloud trên GitHub tại đây ) - và nó không nằm trong số các kết quả được trả về dpkg-query -L. Tìm kiếm với find / -name state-ok -type fvẻ ngoài đã bị đình trệ nhưng tôi sẽ để nó chạy qua đêm.
Tom Brossman

@TomBrossman Tôi chắc chắn chúng ta có thể tìm ra. Tôi sẽ cài đặt ownCloud để xem.
Jacob Vlijm

1
@TomBrossman Máy chủ có thể tạm thời ngừng hoạt động, tôi gặp lỗi 404 - không tìm thấy lỗi trên một số phần .. Nhìn vào tệp .deb đã tải xuống, owncloud sẽ cài đặt khá nhiều biểu tượng /usr/share/icons/hicolor/<size>/apps . Thật không may, tệp .deb không cài đặt: Errors were encountered while processing:Tôi sẽ thử lại sau ...
Jacob Vlijm

4

Các biểu tượng và vị trí tiềm năng của chúng

Có hai cách chỉ báo có thể sử dụng các biểu tượng:

  • Biểu tượng tùy chỉnh. Điều này thường đi vào /usr/share/pixmaps/, mặc dù có thể một số tác giả gửi biểu tượng chỉ báo đến các thư mục khác. Jacob Vlijm, người có câu trả lời trên trang này và cũng là tác giả của chỉ báo SpaceView, đã chọn đặt biểu tượng cho chỉ báo đó vào /opt/spaceview/icon. Với các loại biểu tượng này, nó hơi phức tạp nhưng không phức tạp - sử dụng dpkg -L <package name>hoặc cat /var/lib/dpkg/info/PACKAGE.listtìm kiếm tệp biểu tượng, có .pnghoặc .svgmở rộng. Đây là những điển hình nhất
  • Tiêu chuẩn, biểu tượng cụ thể theo chủ đề. Chúng thường có thể được tìm thấy trong /usr/share/iconsthư mục. Chẳng hạn, trong các chỉ số của tôi như Chỉ số Udisks, tôi thường dựa vào những gì trong đó /usr/share/icons/gnome, vì đây là các tiêu chuẩn và đi kèm với bất kỳ cài đặt Ubuntu nào. Nếu bạn không tìm thấy biểu tượng từ truy vấn dpkg, rất có thể gói đó sử dụng biểu tượng chuẩn.

Về nguồn

Nếu một chỉ báo được viết bằng Python hoặc Ruby, việc tìm kiếm mã nguồn để tìm manh mối có thể tương đối dễ dàng, vì đây là các tập lệnh và nó đủ để sử dụng grepđể tìm kiếm thông qua mã nguồn. Các ngôn ngữ được biên dịch như C và Vala không đi kèm với mã nguồn, vì vậy bạn sẽ phải lấy nó, thông qua apt-get source package-namehoặc từ bất cứ nơi nào bạn nhận được gói. (Người dùng thích mạo hiểm có thể sử dụng hexdumphoặc dịch ngược tệp thực thi, nhưng IMHO quá nhiều công việc chỉ vì tò mò về một biểu tượng).

LƯU Ý : nếu một cư trú biểu tượng trong một trong các thư mục tiêu chuẩn, chẳng hạn như /usr/share/icons/hay /usr/share/pixmaps, tác giả của phần mềm có thể chọn để gọi vào biểu tượng đơn giản bằng tên, mà không mở rộng. Ví dụ: trong tôi udisks-indicatorsử dụng dòng này để gọi một trong các biểu tượng tiêu chuẩn:

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

Thông báo thiếu .svghoặc .pngmở rộng. Do đó, trong trường hợp này, chúng ta có một tên của biểu tượng và chúng ta có thể định vị nó bằng các lệnh tiêu chuẩn của Linux như locatehoặc find.

Tìm kiếm bằng các công cụ Linux tiêu chuẩn

Nếu bạn thực sự muốn có một lệnh để tìm kiếm các biểu tượng, chỉ cần sử dụng kết hợp đơn giản này:

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

Đây là một ví dụ. Tôi biết thực tế là chỉ số diskman sử dụng biểu tượng tùy chỉnh. Vậy lệnh này cho chúng ta biết điều gì?

$ 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

Lưu ý /usr/share/pixmaps/indicator-diskman.pnghình ảnh cuối cùng, đó là những gì chỉ báo thực sự hiển thị trên bảng điều khiển.

Và nếu chỉ báo sử dụng một biểu tượng tiêu chuẩn thì sao? Rõ ràng là sẽ không có đầu ra:

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

$

Phần kết luận

Mặc dù không có tiêu chuẩn nào được đặt ra, nhưng có các vị trí điển hình nơi các biểu tượng đi và chúng ta có thể sử dụng dpkgđể truy vấn thông tin về các tệp đi kèm với mỗi gói cụ thể. Cuối cùng, có thể đó không phải là đề xuất kỹ thuật nhất, nhưng hãy xem xét việc gửi email cho các nhà phát triển hoặc dừng lại bởi IRC hoặc trò chuyện của họ và chỉ cần hỏi họ "Này, chỉ số của bạn sử dụng biểu tượng nào?". Các nhà phát triển thường rất vui khi được nghe từ những người sử dụng phần mềm của họ và không ngại trả lời một câu hỏi nhanh.


Cảm ơn, câu trả lời này cũng rất hữu ích nhưng đồng bộ hóa máy tính để bàn của riêng tôi đang làm điều gì đó kỳ lạ với các biểu tượng và tôi hy vọng cũng sẽ tìm ra điều đó.
Tom Brossman

@TomBrossman bằng cách làm điều gì đó kỳ lạ, chính xác ý bạn là gì?
Sergiy Kolodyazhnyy

Ứng dụng Desktop Sync của ownCloud cài đặt một loạt các biểu tượng mà nó không sử dụng. Tôi đã hy vọng tùy chỉnh và thay thế chúng nhưng vì nó tạo ra chúng một cách nhanh chóng /tmpnên nó không thực tế. Mặc dù vậy, việc tùy chỉnh chúng cho hầu hết các ứng dụng rất dễ dàng bằng cách sử dụng câu trả lời của bạn, vì chúng sử dụng (các) bộ biểu tượng được cài đặt.
Tom Brossman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.