Изменение содержимого глобальных переменных в сценарии Lua для Awesome Window Manager?

Итак, я пытался настроить свою конфигурацию Awesome WM (rc.lua), чтобы определить, подключена ли моя модель IBM M13 к моему ноутбуку после входа в систему / сброса. Это необходимо для изменения того, каким должен быть мод-ключ, поскольку у M13 нет супер-ключа.

Следующий код имеет для меня смысл и меняет modkey внутри функции, созданной для функции awful.spawn.easy_async, но после завершения modkey возвращается к Mod4.

modkey = "Mod4"

awful.spawn.easy_async(
   "xinput list",
   function(stdout, stderr, reason, code)
      local msg = "Regular keyboard Modkey = Super"

      -- Debug notification that shows that the modkey is 
      -- at its default for the superkey Mod4
      naughty.notify({
         text = modkey,
         timeout =7
      })

      if code ~= 0 then
         msg = "Missing xinput to see devices\nModkey = Super"
      elseif stdout:match("CHESEN") == "CHESEN" then 
         -- CHESEN is my PS/2 to USB adapter
         msg = "IBM M13 detected\nModkey = Alt"
         modkey = "Mod1"  -- Sets new modkey to Alt
      end

      -- Notification message
      naughty.notify({
         text = msg,
         timeout =7
      })
   end
)
-- Debug notification to verify key but key goes back to Mod4
naughty.notify({
   text = modkey,
   timeout =7
})

Результат можно увидеть здесь. Он не распечатывает уведомления по порядку, но оба отпечатка Mod 4 являются отпечатками отладки.

Вывод уведомления

Я мало использую Lua, за исключением того, что время от времени меняю свои конфигурации, поэтому мне сложно понять, как можно изменить modkey моей глобальной переменной без ее сброса. Другие методы, которые я пробовал, состояли в том, чтобы определить функцию как функцию, которую я назвал setModKey, чтобы передать ее в качестве параметра easy_async, и я попытался установить modkey с помощью _G, чтобы установить его как _G.modkey, но в итоге получил тот же результат.

Мне не хватает чего-то фундаментального для Lua, или на это влияет то, как Awesome WM использует Lua? Любая помощь будет очень признательна.


person Christopher Ranc    schedule 26.01.2018    source источник
comment
Почему это в awful.spawn.easy_async? Если вы хотите, чтобы это происходило при каждом сбросе, просто поместите содержимое функции после modkey = "Mod4".   -  person Henri Menke    schedule 27.01.2018


Ответы (1)


Используйте io.popen вместо awful.spawn.easy_async. Да, обычно использование io.popen действительно не рекомендуется, но здесь происходит следующее:

  • Отличные старты
  • Вы вызываете easy_async, чтобы захватить вывод xinput list
  • Поскольку это асинхронный режим, ваша конфигурация продолжает загружаться, например, все ваши сочетания клавиш настроены
  • easy_async выполняет свою работу, а вы устанавливаете modkey на что-то другое.

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

И для ваших отладочных вызовов naughty.notify: сначала срабатывает тот, который после функции, и только потом, потом, срабатывает внутренний. Таким образом, он не возвращается, а вместо этого вы сначала показываете старое значение, а только потом новое.

person Uli Schlachter    schedule 27.01.2018
comment
Спасибо большое. Мне следовало подумать об этом в справочных материалах Lua, но в основном я просто проверял документацию Awesome по API. Ценю помощь :) - person Christopher Ranc; 27.01.2018