linux - 为什么我的 SDL Linux 应用程序在应用程序菜单中具有正确的图标,但在任务栏中却没有?

标签 linux icons sdl freedesktop.org

我正在尝试为我的 Linux 应用程序调试一个奇怪的图标问题。当我在应用程序菜单中搜索该应用程序时,它显示正确的图标,但当我运行应用程序本身时,该图标被破坏(它显示默认图标,即方形齿轮图标)。

Icon works in the application menu Broken icon in the task bar

这是应用程序的桌面文件,安装到/usr/local/share/applications/com.example.Xjump.desktop

[Desktop Entry]
Version=1.0
Type=Application
Name=XJump
Comment=A jumping game
Exec=xjump
Icon=com.example.Xjump
Terminal=false
Categories=Game;ArcadeGame;

该应用程序是使用 SDL 实现的。 PNG 图标以 32x32、64x64 和 128x128 版本安装到/usr/local/share。 (例如/usr/local/share/icons/hicolor/32x32/apps/com.example.Xjump.png)。

我注意到的另一件事是,如果我将图标名称更改为 xjump,与可执行文件名称匹配,则任务栏图标可以正常工作! 也就是说,如果我将桌面文件更改为 Icon=xjump 并将 png 重命名为 xjump.png 然后图标在应用菜单和任务栏上都能正常工作。但是,我认为我无法真正做到这一点,因为 Linux 打包指南更喜欢应用程序和图标名称遵循“反向 URL”约定。

最佳答案

一旦应用程序运行,GNOME 就会查看 Windows 的窗口类来确定正确的图标,因为它不再知道哪个桌面文件负责启动它。应用程序有责任在启动期间正确初始化窗口类。

对于 SDL 应用程序,the default behavior似乎是从环境变量中获取窗口类,如果未设置这些变量,则使用可执行文件名称作为默认值。这就是为什么当我给图标指定与可执行文件相同的名称时,我可以显示图标。

最终对我有用的修复是设置环境变量。一种方法是在 SDL_Init 之前调用 setenv

setenv("SDL_VIDEO_WAYLAND_WMCLASS", "com.example.Xjump", 0);
setenv("SDL_VIDEO_X11_WMCLASS",     "com.example.Xjump", 0);

关于linux - 为什么我的 SDL Linux 应用程序在应用程序菜单中具有正确的图标,但在任务栏中却没有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75203814/

相关文章:

linux - 如何设置 Vim 为终端的十六色?

linux - 检查 xCode 的安装总是返回 true

linux - 在 linux 或 windows 中更改目录中的所有文件名和扩展名

python - 通过 SSH 在远程服务器上运行 Python 脚本

android - 如何从 Android 2.3 上的 ActionBarSherlock 溢出菜单中删除图标?

c++ - 一个很好的 OO 方法来做到这一点 (c++)

c++ - 将输入发送到后台窗口

Java Swing 对话框按钮和图标

ios - iTunes Store 拒绝 114x114 图标

c++ - 对 SDL_*many* 的 undefined reference