我遇到了令我烦恼不已的问题
我有一个工作流程,其中同一程序的多个窗口由脚本监控,并根据程序的状态更新 X 窗口图标以反映所需的操作 ( set-icon $WINID state.png
)。有一段时间它运行得很好,但是最近我将我的机器更新为 Kubuntu 16.04 - 这是有史以来最糟糕的主意。
看起来任务管理器标志“使用启动器图标”已被删除,并且不再提供禁用该功能的选项 - Plasma军队使用启动器图标(总是)。
此外,此选项似乎也从配置文件中完全删除了。
我的问题是 - 是否可以恢复此功能?恢复旧版本的任务管理器?
或者是否有其他方法可以(通过脚本)更改任务栏上按钮的图标?
我尝试过完全禁用 plasmashell 并使用其他面板(fbpanel、lxpanel 等),但这些面板在 KDE 中带来的混乱比解决问题的帮助更大
答案1
Yupi!有解决方案
深入研究评论中看到的奇怪行为(Chrome 任务管理器显示窗口图标)我测试了常规 Chrome 窗口和 Tm 窗口的属性。看起来 TM 缺少 WM_CLASS 属性。因此,如果只看到任务栏上的窗口图标,则
xprop -id $WIN_HEX_ID -remove WM_CLASS
或者:
xprop -id $WIN_HEX_ID -format WM_CLASS 8s -set WM_CLASS "my-own-class"
就足够了。但是……
这会产生另一个问题 - 窗口管理器或其他程序经常WM_CLASS
使用它来管理窗口及其相关行为。因此,丢弃这些宝贵的信息是非常适得其反的。不幸的是,如下所示:
- 这篇文章:https://stackoverflow.com/questions/11700728/xprop-setting-multiple-fields-of-atom-property
- 还有这个 xprop 错误:https://bugs.freedesktop.org/show_bug.cgi?id=52633
WM_CLASS
目前无法使用 xprop存储和重新存储完整属性
检查一些可能的选项,我能够使用 python-xlib 模块做到这一点:
from Xlib.display import X, Display
from Xlib.Xatom import STRING
display = Display()
root = display.screen().root
win_hex_id = 0x6a00001 #in my case
win = display.create_resource_object('window', win_hex_id)
saved_prop = win.get_full_property(display.intern_atom('WM_CLASS'),
X.AnyPropertyType , 128).value
#to change:
win.change_property(display.intern_atom('WM_CLASS'),
STRING, 8, 'my-own-class')
#to go back:
win.change_property(display.intern_atom('WM_CLASS'),
STRING, 8, str(saved_prop) )
作为评论 - KDE 或 pyhon-xlib 的奇怪行为是实际的图标更改发生在另一个属性操作(读取/写入)上 - 因此添加:
win.get_full_property(display.intern_atom('WM_CLASS'), X.AnyPropertyType , 128).value
不会伤害