AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 832568
Accepted
Tom Brossman
Tom Brossman
Asked: 2016-10-04 05:08:06 +0800 CST2016-10-04 05:08:06 +0800 CST 2016-10-04 05:08:06 +0800 CST

如何找到非默认状态菜单(又名指标)使用的图标文件?

  • 772

我想找到一些非默认状态菜单(也称为应用程序指示器或指示器小程序)使用的图标的位置。

在此处输入图像描述

这些图标图像文件位于何处?

在我的屏幕截图中,我有 ownCloud 和 Radiotray,但我想要一个不特定于这些特定图标的一般答案。我不知道文件名或文件类型,所以搜索很困难。

unity
  • 2 2 个回答
  • 826 Views

2 个回答

  • Voted
  1. Best Answer
    Jacob Vlijm
    2016-12-28T12:31:24+08:002016-12-28T12:31:24+08:00

    非默认指示器图标的默认位置?

    没有存储这些图标的默认位置。任何应用程序 (-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
    

    如果我们真的需要找出来,搜索代码

    ...我们可以查看(内部)安装的文件以查找字符串“icon”的匹配项。许多指标是用一种脚本语言(如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。(请参阅此处python 如何找到它的模块,子目录部分)

    在这个模块中,我们可以阅读以下部分:

    # 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的案例似乎就是这样一个案例。使用上述方法显示一组图标安装在里面/usr/share/icons/hicolor/<size>/apps。然而,这些图标都没有在 ubuntu的指示器中使用。

    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 会使目录及其图标消失。

    事实证明,可以通过替换这些图标来更改指示器的图标:

    在此处输入图像描述

    这证明这些确实是我们正在寻找的图标。

    然而,要自动化我手动执行的操作,需要一个脚本/包装器,因为每次启动 owncloud 时都会更改创建的目录名称。最方便的选择当然是更改 owncloud-client 的代码。

    另请参阅此处的讨论。

    未完待续...

    • 9
  2. Sergiy Kolodyazhnyy
    2016-12-29T01:48:23+08:002016-12-29T01:48:23+08:00

    图标及其潜在位置

    指示器可以通过两种方式使用图标:

    • 自定义图标。这通常进入/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 Indicator)中,我经常依赖于 中的内容/usr/share/icons/gnome,因为这些是标准的并且随任何 Ubuntu 安装一起提供。如果您没有从查询dpkg中找到图标,则该包可能使用标准图标。

    去源头

    如果指标是用 Python 或 Ruby 编写的,则通过源代码查找线索相对容易,因为这些是脚本,grep用于搜索源代码就足够了。诸如 C 和 Vala 之类的编译语言不附带源代码,因此您必须通过apt-get source package-name或从您获得包的任何地方获得它。(喜欢冒险hexdump的用户可以使用或反编译可执行文件,但恕我直言,仅仅为了对图标感到好奇,工作量太大了)。

    注意:如果图标位于标准目录之一中,例如/usr/share/icons/或/usr/share/pixmaps,则软件作者可以选择仅按名称调用图标,无需扩展名。例如,在我的udisks-indicator我使用这一行来调用标准图标之一:

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

    注意缺少.svg或.png扩展。因此,在这种情况下,我们有一个图标的名称,我们可以使用 Linux 标准命令(例如locate或)来定位它find。

    使用标准 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 或聊天停止,并简单地问他们“嘿,你的指标使用什么图标?”。开发人员通常很高兴收到使用他们软件的人的来信,并且不介意快速回答问题。

    • 4

相关问题

  • 如何将 Web 应用程序放入 Unity Launcher?

  • Ubuntu 上网本 10.10 中没有 Alt+F2?

  • Unity 中的 gnome-do 样式键盘快捷键

  • 在哪里提交 Unity 的错误/愿望清单?

  • Unity 启动器——它可以作为单独的包提供吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve