LINUX.ORG.RU

Awesome - задать иконку программе по классу

 , , ,


0

2
{
	rule = { class = "vacuum-im" },
	properties = { icon = "путь-к-иконке" },
},

Записано в awful.rules.
Иконка меняться не желает. Сам Vacuum тему иконок (не для UI, а для окна) не подхватывает (и еще некоторые приложения типа Firefox Developer Edition).
Как задать?

★★★★★

Мне кажется что напрямую в rc.lua изменить иконку вряд ли удастся. У меня например в файле awful/widget/tasklist.lua изменен код функции, теперь в ней задается иконка по умолчанию, для приложений у которых ее нет.

local function tasklist_update(w, buttons, label, data, widgets)
    local clients = capi.client.get()
    local shownclients = {}
    for k, c in ipairs(clients) do
        if not (c.skip_taskbar or c.hidden
            or c.type == "splash" or c.type == "dock" or c.type == "desktop") then
            --добавляем иконку по умолчанию
            if not c.icon then
                c.icon = capi.image("/home/faiver/.config/awesome/image/default_icon.png") --default icon for unicon application
            end
            table.insert(shownclients, c)
        end
    end
    clients = shownclients

    common.list_update(w, buttons, label, data, widgets, clients)
end
В принципе можно добавить проверку по типу, используя c.class или названия приложения c.name

Faiver
()
Ответ на: комментарий от DeadEye

в консоли xprop | grep CLASS затем мышкой щелкнуть на нужном окне использовать второе значение в кавычках

Faiver
()
Ответ на: комментарий от redhat

отключить иконки

Нет, ни в коем случае. Пилится icon-only taskbar.

собрать программу

Костыль, проживет недолго.

DeadEye ★★★★★
() автор топика
Ответ на: комментарий от Worron

Вставляется в начало tasklist, переопределяем глобальные переменные в локальную область видимости, параллельно обертывая это в таблицу

local capi = { screen = screen, 
               image = image,
               client = client }
В данном конкретном случае, вызывается image из таблицы capi Просто если посмотреть, то почти во всех библиотеках виджетов (lain, vicious) используется данный контекст. По идее, можно было бы просто объявить
local image=image
а затем использовать
c.icon=image(«path»)
Но лучше явно указать область видимости, так сказать во избежание.

Faiver
()
Ответ на: комментарий от Faiver

Какая версия осома? Просто screen и client я среди awesome API вижу, а image нет. И да, посмотри если не сложно, без условия not c.icon, то есть с заменой иконки, это работает?

Worron ★★★
()
Ответ на: комментарий от Worron

Этот код я тестировал на 3.4.15. На 3.5.6, который стоит на дектопе еще не переносил. Если убрать условие, то будет выдавать ошибки, какие именно я так и не понял в свое время, их много, лень было разбираться.

Faiver
()
Ответ на: комментарий от Worron

Сейчас глянул, да, image нет, значит можно ее подгрузить через theme.lua, а затем использовать так:

if not c.icon then
   capi.client.icon = theme.default_image
end

Faiver
()
Ответ на: комментарий от fjfalcon

Как я уже писал выше, если убрать проверку на то, что иконка изначально пустая, то при новом присваивании, почему то генерирует ошибку. Если есть желание, можете покопать в этом направлении. У меня, после того как я с дури, пытался это сделать, пришлось грузится в tty1, там редактировать конфиг, и перезагружать X, и.. как то желание пропало копать дальше.

Faiver
()
Ответ на: комментарий от fjfalcon

Можно еще и для всех. theme.tasklist_disable_icons = true

DeadEye ★★★★★
() автор топика
Ответ на: комментарий от Faiver

Подозреваю, что это на замену тоже не сработает, если вообще сработает. Короче говоря, я бы подтасовывал иконку в tasklist_label, не меняя свойства клиента, а не tasklist_update.

Worron ★★★
()
Ответ на: комментарий от Worron

Хм, странно в 3.4 работает следующий код:

c.icon=image(beautiful.def_icon)
а вот в 3.5.6 данный код вроде срабатывает, но иконку не меняет, а обнуляет на 1 секунду, после чего иконка восстанавливается. Подозреваю, что это связано с кэшированием изображений. Где то в одной из рассылок видел, что хотели запилить подобное. Так что судя по всему, проблема ТС связана скорее с багом данной системы.

Также сейчас на 3.4 проверил, чуть подкорректированный код:

{
	rule = { class = "XTerm" },
	properties = { icon = image"path" },
},
прекрасно работает. А в 3.5.6 уже нет.

В общем надо лезть в библиотеки, если это не поможет, то в исходники.

Faiver
()
Ответ на: комментарий от DeadEye

Другое дело - как выковырять класс из окна

Чтобы не париться с xprop у меня в clienckeys так:

    awful.key({ modkey, "Shift"   }, "x",
    function (c)
        local text = 'class '..c.class
        if (c.instance ~= nil) then text=text..'\n'..'instance '..c.instance end
        if (c.role ~= nil) then text=text..'\n'..'role '..c.role end
        naughty.notify({title='xprop', text=text, timeout=10})
    end),

liaonau
()
Ответ на: комментарий от liaonau

У меня чуть по другому:

awful.key({ modkey, "Control"   }, "i",
  function (c)        
    naughty.notify({title='Свойства приложения', 
      text="Class: ".. c.class..
           "/nInstance: " .. c.instance .. 
           "/nName: " .. c.name .. "/n", 
       width=400, timeout=15})
   end),
Почти то же самое, но дополнительно выводит и class

Faiver
()
Ответ на: комментарий от liaonau

Сорри, не увидел text = 'class '..c.class

А вообще этот способ подходит тем, кто периодически лазит в настройки, просто так обычно в этом уведомлении нет необходимости. Поэтому зачастую xprop проще.

Faiver
()

Всем спасибо. Решил не парить мозг и просто подменить дефолтные иконки у самих приложений. Костыль, но работает.

DeadEye ★★★★★
() автор топика
Ответ на: комментарий от Faiver

Тогда понятно. У меня тоже 3.5.6 и прямое присваивание

c.icon =
не работает от слова совсем. Кэширование изображений есть в gears.surface, но оно, как я понял, строго по аргументу, здесь какая-то другая фигня.

Worron ★★★
()

заменяем в rc.lua стандартное создание tasklist на вот такую штуку

mytasklist[s] = awful.widget.tasklist(s, awful.widget.tasklist.filter.currenttags, mytasklist.buttons, nil, 
function(w, buttons, label, data, objects)
    return awful.widget.common.list_update(w, buttons, function(c)
        local text, bg, bg_image, icon = label(c)
        if not (c.skip_taskbar or c.hidden or c.type == "splash" or c.type == "dock" or c.type == "desktop") then
            if not c.icon then
                icon = awful.util.getdir("config").."/themes/tags/default.png"
            end
            if c.class == 'URxvt' then
                icon = awful.util.getdir("config").."/themes/tags/terminal.png"
            end
        end
        return text, bg, bg_image, icon
    end, data, objects)
end
)
У меня работает в 3.5.6

liaonau
()
Ответ на: комментарий от Faiver

Сейчас погонял дефолтный конфиг, к примеру файловый менеджер выдает иконку в зависимости от открытой директории. То есть периодическое обновление (читай сброс) иконки не баг, а фича, и править tasklist теперь единственный вариант.

Worron ★★★
()
Последнее исправление: Worron (всего исправлений: 1)
23 ноября 2015 г.
Ответ на: комментарий от liaonau
mytasklist[s] = awful.widget.tasklist(s, awful.widget.tasklist.filter.currenttags, mytasklist.buttons, nil, 
function(w, buttons, label, data, objects)
    return awful.widget.common.list_update(w, buttons, function(c)
        local text, bg, bg_image, icon = label(c)
        if not (c.skip_taskbar or c.hidden or c.type == "splash" or c.type == "dock" or c.type == "desktop") then
            if not c.icon then
                icon = awful.util.getdir("config").."/themes/tags/default.png"
            end
            if c.class == 'URxvt' then
                icon = awful.util.getdir("config").."/themes/tags/terminal.png"
            end
        end
        return text, bg, bg_image, icon
    end, data, objects)
end
)

Эм, как-то так:

 rc.lua:188 attempt to index field 'common' ( a nil value )

где 188 строка это:

return awful.widget.common.list_update(w, buttons, function(c) 

Может какой require нужен, или чего-то пропустил?

gBopHuk
()
Ответ на: комментарий от liaonau

local awful = require(«awful»)
awful.widget.common = require(«awful.widget.common»)

Теперь верю - работает =))) Спасибо

gBopHuk
()
Ответ на: комментарий от liaonau

А можно это как-нибудь обернуть в модуль lua? У меня фигня какая-то получается - я просто не умею готовить модули в lua

gBopHuk
()
Ответ на: комментарий от gBopHuk

Одну функцию завернуть в файл? Можно. Не особо нужно, правда, на мой взгляд. Просто надо вернуть функцию из модуля.

--mymodule.lua
--импорты
local нужныештуки = require(…)
return function(w, buttons, label, data, objects)
--тело функции
end
--rc.lua
local mym = require("mymodule")
mytasklist[s] = awful.widget.tasklist(
    s, awful.widget.tasklist.filter.currenttags, mytaslist.buttons, nil, mym)

liaonau
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.