Signals/ru

В Awesome 3.4 были добавлены signal(сигналы) в качестве нового механизма управления событиями(events). Сигналы заменяют старую систему hook и некоторые другие функции, такие как widget.mouse_enter.

Вместо того чтобы использовать:

mytextbox.mouse_leave = function --КОД end

Теперь необходимо использовать в Awesome 3.5:

mytextbox:connect_signal("mouse::leave", function      --КОД  end)

Awesome 3.4 использует "add_signal" вместо "connect_signal" в 3.5.

Например, можно использовать сигналы, для получения вашими виджетами информации о получении/потере ими фокуса мыши: mywidget:add_signal('mouse::leave', function naughty.destroy(calendar[3]) end) Здесь при получении виджетом сигнала 'mouse::leave' о том, что мышь покинула его пределы, вызывается функция 'naughty.destroy'

Вы можете добавлять или удалять обработчик функций вызываемый при поступлении сигнала. Несколько обработчиков могут быть связаны с одним сигналом. Также, при необходимости, вы можете заставить объекты генерировать сигналы вручную. (grep библиотеку awful чтобы найти "emit_signal" и увидеть возможные действия.)

Вы можете создавать свои собственные пользовательские сигналы, и объяснять вашим объектам когда генерировать их. Но большую часть времени мы хотели бы привязывать обработчики к уже существующим сигналам, генерируемым ядром Awesome. Мне не удалось найти достаточно документации о том, какие сигналы используются ядром, и какие аргументы посылает их обработчик. Существуют несколько запросов на рассылку полного их списка.

Поэтому я grepped код C и библиотеку awful (awesome-git, после-3.4.3), и написал эту статью. Значение "/1" в конце названия сигнала указывает, что когда генерируется сигнал, его обработчик принимает один аргумент. Эти аннотации порой умозрительны; я не слишком тщательно проверял каждую часть кода. Моей целью было получить общее представление, которое затем можно усовершенствовать со временем.

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

Каждый сигнал, связан со всеми видами объектов (такими как button, client, и т.д.) и несет дополнительный (первый параметр в списке) аргумент, экземпляр объекта-инициатора (пожалуйста, поправьте меня, если я не прав).

awesome
Сигналы генерируются глобальными объектами :

button
Генерируются сигналы связанные с  мыши:

client
Генерируются сигналы :

dbus
Сигналы генерируются объектами :

key
Генерируются сигналы связанные с :

menu
Генерируются сигналы связанные с объектами :

screen
Генерируются сигналы связанные с :

tag
Генерируются сигналы связанные с :

timer
Генерируются сигналы связанные с :

tooltip
Генерируются сигналы :

wibox
Сигналы генерируются объектами :

widget
Сигналы генерируются :

"Раннее" управление
По умолчанию есть обработчик "управления" сигналами - awful.rules.apply(c). И этот обработчик связывает приложение с текущим тегом. Иногда может потребоваться выполнить какие то действия с приложением перед тем, как обработчик будет запущен. Вот один из возможных способов решения этой проблемы - он добавляет сигнал "early_manage" которые генерируется, для управления новым приложением до запуска awful.rules.apply(c). В основном это тот же сигнал управления, но его обработчик запускается до "управляющего" сигнала обработчика. Исходник: https://github.com/dobrover/myawesome/blob/master/awesome/utils/early_manage.lua

local early_manage = {} -- Module that adds "early_manage" signal that is executed -- before default awesome "manage" signal handler (which is awful.rules.apply) -- Usage: put require('early_manage').setup at the top of rc.lua -- And then just use "early_manage" signal as normal "manage". local capi = { client = client, } local awful = require 'awful' function early_manage.on_before_manage(...) -- Relies on the fact that emit_signal simply calls every signal handler -- in the current event handler. capi.client.emit_signal("early_manage", ...) end function early_manage.setup if not early_manage._setup then early_manage._setup = true capi.client.add_signal("early_manage") capi.client.disconnect_signal("manage", awful.rules.apply) capi.client.connect_signal("manage", early_manage.on_before_manage) capi.client.connect_signal("manage", awful.rules.apply) end end return early_manage