Помогите заставить Conky работать с LXDE & PCManFM - PullRequest
3 голосов
/ 11 августа 2009

Как некоторые из вас могут знать, есть ошибка с Conky или PCManFM (аспект менеджера рабочего стола), из-за которой окно Conky исчезает в одной из следующих ситуаций:

  • Установка "override own_window_type" в .conkyrc (обычная конфигурация для Nautilus) не отображает окно Conky вообще.
  • Установка "own_window_type desktop" в .conkyrc показывает окно Conky, но оно исчезает, если вы щелкаете по рабочему столу.
  • Установка "own_window_type normal" в .conkyrc показывает окно Conky, оно не исчезает при нажатии на рабочем столе, НО ... оно исчезает, если вы используете LXPanel's " Плагин сворачивания всех окон (эквивалент «Показать рабочий стол»). Это происходит при использовании сочетания клавиш.

Существуют некоторые обходные пути, такие как деактивация управления рабочим столом 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 по-прежнему исчезает, как и раньше.

Если кто-то может заглянуть в этот файл и посмотреть, имеют ли смысл мои изменения, я был бы очень признателен.

Спасибо, ТАК! :)

Ответы [ 7 ]

3 голосов
/ 23 июня 2013

Это все еще невозможно, афаик. Я сделал этот причудливый обходной путь. Просто используйте режим own_window_type normal, где вы не можете использовать ярлык Win+D desktop, и исправьте conky на show desktop.

Сначала я подумал, просто переназначение конки-окна поможет. Но я обнаружил, что, пока рабочий стол сфокусирован, ничто не притянется к нему. Тогда я подумал: просто убей и перезапусти конки. Но в режиме show desktop он будет создан в фоновом режиме.

Итак, чтобы вернуть конки:

  • Рабочий стол должен быть не сфокусированным
  • перезапустить 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. Вы увидите вспышку, и Конки вернулся!

Это причудливое решение - единственное решение во вселенной в соответствии с неделей Google, поэтому его улучшение рекомендуется.


Объяснение:

  • zenity --info --text "Переназначение Конки ..." &
    • Нам нужно создать случайное окно, чтобы расфокусировать рабочий стол. Сама Конки не работает. (
    • Нам также нужен сценарий для продолжения, поэтому используйте &
  • PID = $!
    • Получите pid этого последнего процесса
  • сон 0,3
    • Спите меньше (медленный HTPC), и окно закрывается перед его созданием.
  • kill $ pid
    • Убить окно, как только оно выполнит свою функцию.
  • xdotool windowmap xdotool search --classname 'conky'
    • Теперь, наконец, мы можем поднять (переназначить) конки.

Причуды:

  • Рабочий стол не сфокусирован, поэтому вы не можете использовать стрелки для перемещения по значкам на рабочем столе.
    • Можем ли мы перефокусировать рабочий стол? Пока окна не свернуты программно, conky останется на месте.
  • 300 мс задержки и мигание диалогового окна.
  • Повторное нажатие Win + D для возврата («открыть рабочий стол»)
    • Нам понадобится способ определить, находится ли рабочий стол уже в режиме show-desktop-mode, и в этом случае сценарий должен exit 0
2 голосов
/ 16 марта 2014

Самое простое решение, прекрасно работающее с Openbox (и должно работать с другими WM):

  1. В вашем .conkyrc файле:

     own_window yes
     own_window_type desktop
     own_window_class Conky
    

    Тип окна «рабочий стол» предотвращает сворачивание conky при запуске show desktop. Кроме того, ваши окна будут восстановлены путем повторного выполнения «show desktop»

  2. Установите пакет xdotool (он очень легкий, не беспокойтесь), в эмуляторе терминала выполните следующее:

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

    и убедитесь, что ваш conky не прячется, когда вы фокусируете рабочий стол

  3. Если все в порядке, прервите xdotool, нажав Ctrl + C в вашем терминале, и поместите приведенный выше код в автозапуск. Вероятно, он не запустится сразу, поэтому вам нужно создать простой скрипт (например, «show_conky.sh»), содержащий

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

    Минимальное необходимое время сна должно быть определено в соответствии с вашей системой. Конечно, conky не будет прятаться при первом запуске до выполнения show_conky.sh, вы также можете создать другой скрипт с командой xdotool focus windowraise $(xdotool search --class "Conky") и соответствующим временем ожидания (или попытаться добавить его между «sleep» и Команда "xdotool I'm" ведет себя как "show_conky.sh").

  4. Перезагрузите сервер Xorg. Наслаждайтесь! :)

    Я лично советую вам использовать SpaceFM для управления иконками на рабочем столе. Это позволяет вам устанавливать поля для области рабочего стола, поэтому conky никогда не закрывает иконки. Pcmanfm выглядит более дружественным как проводник, но вы можете использовать оба из них: spacefm может открывать каталоги, расположенные на рабочем столе, с другим приложением. Его поведение на рабочем столе идентично pcmanfm, поэтому вы должны просто заменить «Pcmanfm» в приведенном выше коде на «Spacefm»

2 голосов
/ 11 марта 2012

Это старый «вопрос», но он довольно часто встречался в Google, когда я искал «Conky LXDE», потому что я не мог заставить Conky работать в Lubuntu. Но нет необходимости взламывать LXPanel !

После долгих поисков, ложных испытаний и следов я обнаружил файл .conkyrc на "PCLinuxOS-Forums", который только что работал ™. Это отличная база для настройки на Lubuntu 11.10.

Сейчас я использую ту же настройку на Linux Mint 13 LTS "Maya" Xfce (на основе Ubuntu 12.04), и она продолжает отвечать моим (очень простым) требованиям Conky. Текущая форма моего .conkyrc файла сохранена в Gist , если кто-то думает, что это может им помочь. (Исходная ссылка на форум комментируется в файле rc.)

0 голосов
/ 05 июня 2015

Упрощение ответа @ 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
0 голосов
/ 22 января 2015

Для построения решения Редсандро:

Следуйте советам Redsandro и sudo apt-get install xdotool и создайте какой-нибудь скрипт conky-remap.sh (или любой другой) в вашем каталоге /usr/local/bin (или где-либо еще). Также установите wmctrl, если у вас его еще нет. Мы будем использовать это, чтобы сделать Conky активным (я знаю, что это отличается от отображения, но оно ведет себя так, как я ожидаю, поэтому я не волнуюсь.)

запустите wmctrl -l, чтобы вывести список всех окон, пока работает Conky, и принять к сведению заголовок Конки (у меня было что-то вроде Conky (<my-machine-name>).

Пока вы создаете другой файл, в котором мы сохраним текущее состояние рабочего стола (0 = не 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 - это переменные, в которых хранится текущее состояние рабочего стола (опять же, вид) и текущий идентификатор рабочего стола.

xdotool search --desktop $dt . windowmap %@ отображает все окна с текущего рабочего стола обратно на экран и оставляет другие рабочие столы в покое.

Редактировать ~/.config/openbox/lubuntu-rc.xml или где выполнять скрипт при нажатии Win + D.

<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 покажет рабочий стол.
  • Иногда все терпит неудачу, и Конки исчезает со всеми другими окнами, хотя и редко. Просто cat /usr/.../.conky_desktop_state и переключите противоположное значение в (т.е.- echo 1 > /usr/.../.conky_desktop_state)
  • Хотя в большинстве случаев последнее активное окно перед Win + D находится сверху после второго Win + D, оно не обязательно активно, то есть вам, возможно, придется щелкнуть в окне или Alt + Tab, чтобы начать печатать. в этом. Обычно это касается окон терминала.

В идеале мы могли бы просматривать все активные (сопоставленные) окна на каждом рабочем столе по отдельности и выполнять ту или иную команду, основываясь на том, является ли Conky единственным активным окном, но я не был достаточно умен (выделен) сделай так, вот мой вклад. Пожалуйста, основывайтесь на этом и отвечайте.

0 голосов
/ 05 января 2013

получил успех благодаря прозрачности conky в LXDE на debian squeezy с запущенным pcmanfm.

В файле конфигурации 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 не запустится вообще. Очень странно ...

0 голосов
/ 16 февраля 2010

Решение:

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) )
...