LINUX.ORG.RU

Виджеты awesome на рабочем столе.

 , , , ,


2

1

Здравствуйте!

В очередной раз прихожу сюда не найдя ответ на достаточно очевидные вопросы, а так же не справившись с awesome wiki.

Разобравшись с виджетами в меню awesome, я решил сделать нечто подобное на рабочем столе, однако, большинство того, что я находил в интернете уже потеряло свою актуальность. (как правило русскоязычные источники если и рассказывают по сабжу, датированы они примерно 2013 годом.)

Собственно цель - научиться рисовать виджеты различными геометрическими примитивами - линии, круги, треугольники, точки, с возможностью закраски фигур, с поддержкой прозрачности и возможностью добавления текста, а так же вывод результатов команд (lua,zsh)

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

P.S.: Если кто знает, может быть есть насыщенная статья по актуальному awesome с разбором различных библиотек, которые идут по умолчанию (пока искал, находил отсылки к conky, vicious - однако хотелось бы обойтись штатными инструментами.)


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

Вот, пару месяцев назад:
Awesome WM 4.0

Там же и ссылка на github.

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

Годнота, видел его. Однако, дело в том, что с awesome я около недели только столкнулся, равно как с конфигами awesome и lua.

Боюсь, что подобные вещи достаточно тяжело зайдут в качестве примера (по крайней мере как основы), однако все равно попробую разобрать его исходники, спасибо!

Ukio
() автор топика
Ответ на: комментарий от Deleted

Так же:

однако хотелось бы обойтись штатными инструментами.

Ukio
() автор топика

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

conky тоже поддерживает рисование простых примитивов описывая их на lua

средствами самого awesome лучше отображать только информацию непосредственно относящуюся к управлению окнами (типа панели задач, иконки тега)

в то же время, очевидно, что только ради одних часов и, например, одного виджета для отображения текущей песни проще сделать всё средствами awesome, чем вводить еще одну сущность

actionless ★★★★★
()
Последнее исправление: actionless (всего исправлений: 2)
Ответ на: комментарий от actionless

А как отрисовать виджет?

Например, хотя бы тот же черный квадрат с надписью Hello World!

Меня этот awesome уже до истерики довел, объясните, пожалуйста, куда, что и почему именно это писать.

Я так понимаю, что за виджеты отвечает wibox.widget или просто wibox. И, примерно, объявление в rc.lua должно выглядеть следующим образом :

local my_new_widget=wibox.widget({
  width=100
  height=100
  x=50
  y=50
  bg="#000000"
  opacity=0.5
  screen="Primary" -- До сих пор не понял, какие еще можно указывать
  })

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

И как это дело в итоге отрисовывается?

:draw

не работает :с

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

там перечислены типы аргументов, в твоём примере screen типа string, а не screen

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

Вот рабочий пример, хотя немного стилистически устаревший

local wibox = require("wibox")
local color = require("gears.color")

-- Создать пользовательский виджет (пусть это будет простейший прогресбар)
local my_widget = wibox.widget.base.make_widget()
my_widget._value = 0.5 -- в этой переменной будем хранить текущее значения для прогресбара

-- пример добавления нового метода для виджета
-- изменяем значение переменной и даем команду на перерисвку виджета
function my_widget:set_value(x)
	self._value = x < 1 and x or 1
	self:emit_signal("widget::updated")
end

-- этот метот определяет как наш виджет будет вписывать себя в выделенное пространство
-- в данном простейшем случае виджет просто занимает все доступное место
function my_widget:fit(context, width, height) return width, height end

-- здесь сообственно и русиется сам виджет
-- гуглить 'cairo drawing' для понимания как рисовать примитивы и текст
function my_widget:draw(context, cr, width, height)
	cr:set_source(color("#800000"))
	cr:rectangle(0, 0, self._value * width, height)
	cr:fill()
end

-- Пользовательский виджет готов, теперь разместим его на рабочем столе

-- Создать wibox для рабочего стола
local desktop_wibox = wibox({ type = "desktop", visible = true, bg = "#000000" })
desktop_wibox:geometry({ x = 100, y = 100, width = 500, height = 200 })

-- Поместить наш виджет на подготовленный wibox
desktop_wibox:set_widget(my_widget)

-- Задать значение прогресбара
my_widget:set_value(0.8)

Мне лень, но в общем для приведения к актуальному на сегодня стилю кода смотри документацию и дефолтные модули.

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

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

Не обязательно, если awesome не на совсем калькуляторе запущен, и виджеты более-менее разумно написаны, проблем быть не должно. Тем более по сравнению с conky lua у осома есть ряд преимуществ.

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

Очень ждал именно вашего ответа, и не зря!

Огромное спасибо за крайне доходчивое объяснение.

Вечером попробую, но думаю с такими пояснениями проблем быть не должно.

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

Опробовал - все действительно работает! Огромное спасибо, ваша помощь была как минимум неоценимой!

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

Только вот возникал вопрос на протяении чтения всей вики и когда ваш код смотрел:

function my_widget:draw(context, cr, width, height)

Я так понимаю, что cr - это некий экземпляр объекта cairo, а чем в свою очередь является context?

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

UPD:

-- Create a surface
local img = cairo.ImageSurface.create(cairo.Format.ARGB32, 50, 50)

-- Create a context
local cr  = cairo.Context(img)

С этим рисует. Однако, что же это такое, и как этим пользоваться?

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

а чем в свою очередь является context?

Этот объект содержит некую дополнительную информацию для виджета, вроде dpi, может еще что-то. Честно сам не особо в курсе, этот параметр добавили относительно недавно, пока не возникало повода его использовать и соответственно разобраться.

Однако, что же это такое, и как этим пользоваться?

Cairo context, как правило передается в виджет в виде параметра. Если лень читать всю теорию по cairo, то смотреть примеры здесь, приводить к ОО виду

cairo_line_to(cr, 10, 20) -> cr:line_to(10, 20)
cairo_rectangle(cr, 0, 0, 256, 256) -> cr:rectangle(0, 0, 256, 256)
cairo_stroke(cr) -> cr:stroke()
и пробовать рисовать линии, квадраты и прочее.

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

Отлично!

Уже чутка освоился - перенес в desktop_wibox виджет с зарядом батареи из трея с обновлением по таймеру с:

Если бы не ваша помощь, то вряд ли бы получилось то, что получилось.

Спасибо огромное еще раз!

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