пятница, 10 июля 2009 г.

Избавляемся от пустых одинаковых иконок. Раскрасим аскетичный рабочий стол.

Проблема

Если вы - пользователь лёгкого оконного менеджера и используете по большей части консольные приложения, или такие программы, как, например, xpdf, mplayer, conkeror, то с проблемой вы, скорее всего знакомы. Дело в том, что эти программы имеют проблемы со значками, которые можно видеть при переключении окон альт-табом или на рамке окна. Все они имеют одну и ту же иконку, неинформативное пустое изображение, которое только мозолит глаза, но не помогает разобраться что это за программа. Знакомая картина?

Не знаю можно ли решить данную проблему более элегантным способом, но был бы рад услышать, если у кого-нибудь есть мысли по этому поводу. Я же нашёл следующее решение, использующее программу fbpanel.

В результате будет так.

Решение

Панель fbpanel сама по себе - весьма хорошее решение для легковесного рабочего стола, однако лично я больше предпочитаю tint2. Однако именно fbpanel позволяет решить озвученную выше проблему - назначает различным приложениям свои иконки.

Установка и конфигурация

В Debian эта программа есть в репозиториях, поэтому ставится как обычно:

$ sudo aptitude install fbpanel

Конфигурационный файл по умолчанию: /etc/fbpanel/default. Чтобы использовать свой конфиг надо создать директорию ~/.fbpanel, если ещё нет, и положить туда конфиг, который мы будем модернизировать (я его назвал icons_panel):

$ mkdir ~/.fbpanel
$ cp /etc/fbpanel/default ~/.fbpanel/icons_panel
Чтобы использовать профиль icons_panel, запуск осуществляем командой:
$ fbpanel -p icons_panel
Теперь открываем файл ~/.fbpanel/icons_panel в своём любимом текстовом редакторе и редактируем. После изменения профиля, надо перезапустить fbpanel.

В первую очередь нас интересуют поля в нижней части файла:

# 'icons' plugin lets you customize window icons.

# these changes apply to entire desktop
Plugin {
    type = icons
    config {
        DefaultIcon = /usr/share/fbpanel/images/default.xpm
        application {
            icon = gnome-terminal
            Image =  /usr/share/fbpanel/images/gnome_terminal.svg
            ClassName = XTerm
        }
        ...
    }
}

Например, окну, у которого ClassName есть XTerm будет назначена иконка gnome-terminal из вашей темы gtk-2 (если я правильно понял) или /usr/share/fbpanel/images/gnome_terminal.svg.

Таким образом, если я хочу, чтобы conkeror имел иконку firefox, я просто запишу в эту секцию конфига:

application {
    icon = firefox
    Image = /home/maxim/.icons/my_icons/firefox.png
    ClassName = Conkeror
}
Если в используемой теме gtk-2 есть иконка firefox, то будет использована она. Если - нет, то будет использована /home/maxim/.icons/my_icons/firefox.png. Эти действия повлияют на окно, у которого ClassName = Conkeror.

Как узнать что есть ClassName для заданного приложения? Нет ничего проще. Наберите в терминале следующую команду и ткните мышью в интересующее окно.

$ xprop | grep WM_CLASS
В случае conkeror я получил выхлоп:
WM_CLASS(STRING) = "Navigator", "Conkeror"
Первый параметр есть AppName, который нам пригодится позже, а второй, "Conkeror", и есть искомый ClassName.

Подобную процедуру мы можем провести с mplayer, xpdf, с другими неконсольными приложениями.

Здорово! Но это не всё. Ведь все приложения, запущенные в терминале будет тогда иметь тот же вид, что и терминал, так что потом среди них не разберёшься. Тут на помощь придёт AppName.

Если просто запустить, какое-нибудь консольное приложение, скажем, ncmpc, в xterm, я получаю выхлоп от xprop:

WM_CLASS(STRING) = "xterm", "XTerm"

Ни о каком названии запущенного приложения не упоминается.

Но если запустить так:

$ xterm -name ncmpc -e ncmpc
то ситуация изменится:
$ xprop  | grep WM_CLASS
WM_CLASS(STRING) = "ncmpc", "XTerm"

Теперь, чтобы fbpanel отличала обычный терминал от консольного приложения ncmpc, в конфиг следует прописать следующее:

application {
    Image = /home/maxim/.icons/my_icons/media-player-banshee.png
    AppName = ncmpc
    ClassName = XTerm
}

Аналогично, скажем, для MidnightCommander ($ xterm -name mc -e mc):

application {
    icon = mc
    AppName = mc
    ClassName = XTerm
}

Очевидно, что не очень удобно запуск консольного приложения осуществлять в другом терминале, поэтому лучше такие запуски вешать на хоткеи или в меню запуска вашего оконного менеджера.

Если используем другую панель

Всё так здорово, но мы не хотим использовать fbpanel в качестве панели? Для этого мы можем сделать панель очень маленькой и поместить в какой-нибудь угол - видеть её мы не будем, а памяти она занимает немного. Для этого редактируем секцию General (я задал ширину width=0 и высоту в один пиксель, height=1) и удаляем все плагины кроме определений иконок.

Приведу свой конфиг:

Global {
    edge = top
    allign = right
    margin = 0
    widthtype = percent
    width = 0
    height = 1
    transparent = false
    tintcolor = #ffffff
    alpha = 37
    setdocktype = true
    setpartialstrut = true
    autohide = true
    heightWhenHidden = 2
}

Plugin {
    type = icons
    config {
        DefaultIcon = /usr/share/fbpanel/images/default.xpm
        application {
            icon = gnome-terminal
            Image = /usr/share/fbpanel/images/gnome_terminal.svg
            ClassName = XTerm
        }
        application {
            icon = gnome-terminal
            Image = /usr/share/fbpanel/images/gnome_terminal.svg
            ClassName = URxvt
        }
        application {
            icon = gnome-emacs
            Image = /usr/share/fbpanel/images/emacs.svg
            ClassName = Emacs
        }
        application {
            icon = mozilla-firefox
            ClassName = Firefox-bin
        }
        application {
            icon = mozilla-firefox
            ClassName = Firefox
        }
        application {
            Image = /home/maxim/.icons/my_icons/totem.svg
            ClassName = MPlayer
        }
        application {
            Image = /home/maxim/.icons/my_icons/xpdf.svg
            ClassName = Xpdf
        }
        application {
            icon = opera
            Image = /home/maxim/.icons/my_icons/opera.svg
            ClassName = Opera
        }
        application {
            icon = firefox
            Image = /home/maxim/.icons/my_icons/firefox.png
            ClassName = Conkeror
        }
        application {
            Image = /home/maxim/.icons/my_icons/media-player-banshee.png
            AppName = ncmpc
            ClassName = XTerm
        }
        application {
            Image = /home/maxim/.icons/my_icons/email.png
            AppName = mymail
            ClassName = XTerm
        }
        application {
            icon = mc
            AppName = mc
            ClassName = XTerm
        }
    }
}

В результате fbpanel делает своё дело, назначает окнам иконки, а в качестве панели мы используем что-нибудь другое, в моём случае это tint2.

Копируете статью - поставьте ссылку на оригинал!

1 комментарий:

  1. Спасибо. Мне статья очень помогла, когда мне понадобилось сменить иконку для xterm. Самое удобное, декларативное решение. Хотя при поиске в гугле выдаются другие советы: .Xresources + xbm-иконка, и некая некомпилирующаяся у меня утилита xseticon.

    ОтветитьУдалить