3

正如你们中的一些人可能知道的那样,Conky 或 PCManFM(它的桌面管理器方面)存在一个错误,导致 Conky 窗口在以下一种情况下消失:

  • 在 .conkyrc(Nautilus 的常用配置)中设置“own_window_type override”根本不会显示 Conky 窗口。
  • 在 .conkyrc 中设置“own_window_type desktop”会显示 Conky 窗口,但如果单击桌面,它就会消失。
  • 在 .conkyrc 中设置“own_window_type normal”会显示 Conky 窗口,单击桌面时它不会消失,但是......如果您使用 LXPanel 的“最小化所有窗口”插件(“显示桌面”等效项),它会消失。如果使用键盘快捷键也会发生这种情况。

有一些解决方法,例如停用 PCManFM 的桌面管理(并使用 feh 设置壁纸,并且可能使用 iDesk 设置图标)或完全使用另一个文件管理器,但我注意到这些都是低于标准的解决方案。我真的很喜欢 PCManFM,我真的很喜欢 Conky。男人要做什么?:-/

所以我挖掘了LXPanel 的源代码并找到了一段相关的代码,它可能包含我的修复。该文件是 src/plugins/wincmd.c 。

我的想法是,当单击“最小化所有窗口”按钮时,所有窗口(类)名称将与静态字符串“Conky”进行比较,如果匹配,它根本不会最小化该窗口。很简单,它应该可以工作。但问题是我已经有几年没有接触过任何 C 代码了,而且我还没有真正玩过 Xlib。

到目前为止,我做了以下更改:

19a20
> #include <string.h>
77a79,82
>             
>             /* Getting window's class name */
>             XClassHint class;
>             XGetClassHint(GDK_DISPLAY(), client_list[i], &class);
81c88
<             if (((task_desktop == -1) || (task_desktop == current_desktop))
---
>             if (((task_desktop == -1) || (task_desktop == current_desktop) || strcmp(class.res_name, "Conky") != 0)

这编译正确,但是当我运行新的 lxpanel 并单击“最小化所有窗口”时,Conky 仍然像以前一样消失。

如果有人可以查看此文件并查看我的更改是否有意义,我将非常感激。

谢谢!:)

4

7 回答 7

3

这仍然是不可能的。我做了这个古怪的解决方法。只需使用own_window_type normal无法使用Win+D desktop快捷方式的模式,并在显示桌面上修复 conky。

首先我想,只需重新映射 conky 窗口就可以了。但我发现,只要桌面聚焦,就不会在上面绘制任何东西。然后我想,只需杀死并重新启动conky。但是在show desktop模式下,它将在后台创建。

所以为了让conky回来:

  • 桌面必须没有焦点
  • 重新启动 conky 或重新映射窗口

安装 xdotool;apt-get install xdotool
创建一个脚本,例如/usr/local/bin/conky-remap.sh

#!/usr/bin/env bash
zenity --info --text "Remapping Conky..." &
pid=$!
sleep 0.3
kill $pid
xdotool windowmap `xdotool search --classname 'conky'`

编辑~/.config/openbox/lxde-rc.xml(或发行版中的任何快捷方式)。

寻找:

<keybind key="W-d">
  <action name="ToggleShowDesktop"/>
</keybind>

改成:

<keybind key="W-d">
  <action name="ToggleShowDesktop"/>
  <action name="Execute">
    <execute>conky-remap.sh</execute>
  </action>
</keybind>

激活新的键盘快捷键配置:
openbox --reconfigure

按 Win+D。你会看到一闪而过,conky又回来了!

根据谷歌一周的研究,这个古怪的解决方案是宇宙中唯一的解决方案,因此鼓励对其进行改进。


解释:

  • zenity --info --text "重新映射 Conky..." &
    • 我们需要创建一个随机窗口来使桌面失焦。Conky 本身不起作用。:(
    • 我们还需要脚本继续,所以使用&
  • pid=$!
    • 获取pid最后一个过程的
  • 睡眠 0.3
    • 少睡一点(慢 HTPC),窗口在创建之前就被杀死了。
  • 杀死$pid
    • 一旦窗口执行了它的功能就杀死它。
  • xdotool 窗口地图xdotool search --classname 'conky'
    • 现在终于,我们可以raise (remap) conky了。

怪癖:

  • 桌面未聚焦,因此您无法使用箭头导航桌面图标
    • 我们可以重新聚焦桌面吗?只要窗口没有以编程方式最小化,conky 就会保持不变。
  • 300 毫秒的延迟,以及对话框的闪烁。
  • 第二次按 Win+D 返回('取消显示桌面')
    • 我们需要一种方法来检测桌面是否已经处于显示桌面模式,在这种情况下脚本应该exit 0
于 2013-06-23T15:49:04.150 回答
2

最简单的解决方案与 Openbox 完美配合(也应与其他 WM 配合使用):

  1. 在您的.conkyrc文件中:

     own_window yes
     own_window_type desktop
     own_window_class Conky
    

    “桌面”窗口类型可防止执行显示桌面时最小化 conky。此外,您的窗口将通过再次执行“显示桌面”来恢复

  2. 安装xdotool包(它非常轻量级,不用担心),在终端模拟器中运行以下命令:

    xdotool search --class "Pcmanfm" behave %@ focus windowraise $(xdotool search --class "Conky")

    并确保当您聚焦桌面时您的 conky 不会隐藏

  3. 如果一切正常,请在终端中按 Ctrl+C 中断 xdotool,并将上面的代码放入自动启动中。它可能不会立即启动,因此您必须创建一个简单的脚本(例如“show_conky.sh”),其中包含

    #!/bin/sh sleep 5 xdotool search --class "Pcmanfm" behave %@ focus windowraise $(xdotool search --class "Conky")

    应根据您的系统定义所需的最短睡眠时间。可以肯定的是,在执行“show_conky.sh”之前,conky 不会在第一次启动时隐藏,您还可以创建另一个脚本,其中包含xdotool focus windowraise $(xdotool search --class "Conky")命令和适当的睡眠时间(或尝试在“睡眠”和“xdotool 行为”之间添加它”命令它“show_conky.sh”)。

  4. 重新启动您的 Xorg 服务器。享受!:)

    我个人建议您使用 SpaceFM 来管理桌面图标。它允许您为桌面区域设置边距,因此 conky 永远不会覆盖图标。pcmanfm 作为资源管理器看起来更友好,但您可以同时使用它们:spacefm 可以使用其他应用程序打开位于桌面上的目录。它的桌面行为与 pcmanfm 相同,因此您只需将上面代码中的“Pcmanfm”替换为“Spacefm”

于 2014-03-16T18:44:04.367 回答
2

这是一个古老的“问题”,但当我搜索“Conky LXDE”时,它在 Google 的点击率相当高,因为我无法让 Conky 在 Lubuntu 中工作。但是没有必要破解 LXPanel

经过大量搜索和错误的试验和跟踪,我.conkyrc在“PCLinuxOS-Forums”中找到了一个 Just Worked™ 的文件。事实证明,它是从 Lubuntu 11.10 进行调整的绝佳基础。

我现在在 Linux Mint 13 LTS “Maya” Xfce(基于 Ubuntu 12.04)上使用相同的设置,它继续满足我(非常简单的)Conky 要求。如果有人认为它可能对他们有帮助,我的.conkyrc文件的当前形式会保存在 Gist中。(论坛的原始源链接在rc文件中被注释掉了。)

于 2012-03-11T01:50:44.333 回答
0

以 Redsandro 的解决方案为基础:

遵循 Redsandro 的建议,并在您的(或任何地方)目录中sudo apt-get install xdotool创建一些conky-remap.sh(或其他)脚本。/usr/local/bin另外,wmctrl如果您还没有安装它。我们将使用它来激活 Conky(我知道这与映射不同,但它的行为与我预期的一样,所以我并不担心。)

运行wmctrl -l以在 Conky 运行时列出所有窗口并记下 Conky 的标题(我的标题类似于Conky (<my-machine-name>).

当您在创建另一个文件时,我们将在其中保存桌面的当前状态(0=not show-desktop-mode,1=show-desktop-mode ... 几乎),名为.conky_desktop_state. 我也把这个放进去/usr/local/bin了。现在回到conky-remap.sh

#!/usr/bin/env bash

state=$(cat /usr/local/bin/.conky_desktop_state)
dt=$(xdotool get_desktop)

if (( $state == 1 )) ; then
        echo 0 > /usr/local/bin/.conky_desktop_state
        wmctrl -a "Conky (<my-machine-name>)"
else
        echo 1 > /usr/local/bin/.conky_desktop_state
        wmctrl -a "Conky (<my-machine-name>)"
        xdotool search --desktop $dt . windowmap %@
fi

wmctrl的激活窗口的命令不关心桌面是否处于焦点,因此我们不需要休眠或将对话窗口闪烁到屏幕上。$state并且$dt是保存桌面当前状态(同样,种类)和当前桌面 ID 号的变量。

xdotool search --desktop $dt . windowmap %@将当前桌面的所有窗口映射回屏幕,而让其他桌面保持不变。

按下 Win+D 时编辑~/.config/openbox/lubuntu-rc.xml或在任何地方执行脚本。

<keybind key="W-d">
  <action name="ToggleShowDesktop"/>
  <action name="Execute">
    <command>conky-remap.sh</command>
  </action>
</keybind>

openbox --reconfigure刷新键绑定,你应该很高兴。

使用 Win-D 显示桌面,桌面获得焦点,因此您可以使用箭头键来导航桌面图标。

这个解决方案确实有自己的一套怪癖:

  • 第二次按下 Win+D 会调出当前桌面的所有窗口,而不仅仅是在显示桌面之前处于活动状态的窗口。
  • 切换存储在 中.conky_desktop_state,但它并不真正匹配,show-desktop-mode因为它仅在脚本执行时切换。这意味着可以显示一个桌面而另一个不显示。在这种情况下,桌面将短暂显示,然后所有窗口都将被激活。再按一次 Win+D 将显示桌面。
  • 有时整个事情都失败了,Conky 和所有其他窗口一起消失了,尽管很少见。只需cat /usr/.../.conky_desktop_state在 (ie- echo 1 > /usr/.../.conky_desktop_state)中切换相反的值
  • 尽管大多数时候 Win+D 之前的最后一个活动窗口在第二个 Win+D 之后位于顶部,但它不一定是活动的,这意味着您可能必须单击窗口或 Alt+Tab 才能开始输入。这通常是终端窗口的情况。

理想情况下,我们将能够单独查看每个桌面上的所有活动(映射)窗口,并根据 Conky 是否是唯一活动窗口来执行一个或另一个命令,但我不够聪明(专注)这样做,所以这是我的贡献。请在此基础上进行回复。

于 2015-01-22T03:51:33.903 回答
0

解决方案是:

NetWMState nws;
guint task_desktop = get_net_wm_desktop(client_list[i]);
get_net_wm_state(client_list[i], &nws);

if (((task_desktop == -1) || (task_desktop == current_desktop))
&& ( ( ! nwwt.dock) && ( ! nwwt.desktop) && ( ! nwwt.splash)
&& ( ! nws.skip_pager) )
于 2010-02-15T23:42:22.357 回答
0

简化@imiric 的回答:

Openbox RC.xml(例如 ~/.config/openbox/lxde-rc.xml):

<keybind key="W-d">
  <action name="ToggleShowDesktop"/>
  <action name="Execute">
    <command>wmctrl -a "Conky (hostname)"</command>
  </action>
</keybind>

〜/ .conkyrc:

own_window yes
own_window_type normal
own_window_class conky-semi
own_window_transparent yes
own_window_hints undecorated,sticky,skip_taskbar,skip_pager
own_window_argb_visual yes
于 2015-06-05T05:45:01.917 回答
-1

在运行 pcmanfm 的 debian squeezy 上的 LXDE 中获得了成功的透明性。

在 conky 配置文件(即 .conkyrc)中,我删除了所有 'own_window' 行,但以下内容除外:

own_window yes
own_window_class conky
own_window_transparent yes
own_window_hints undecorated,below,skip_taskbar,sticky,skip_pager

再次添加一些常用行会导致透明度失败,或者 conky 根本无法启动。很奇怪...

于 2013-01-05T15:16:22.960 回答