Ctrl-O: просмотр пользовательского экрана из любой области

Здесь обсуждается всё, что касается макросов.
Post Reply
User avatar
John Doe
Бюрократ
Posts: 11855
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 26 times
Been thanked: 131 times

Ctrl-O: просмотр пользовательского экрана из любой области

Post by John Doe » Tue 31 Oct, 2017 21:45

Хотя в редакторе/вьювере "из коробки" заявлена возможность по Ctrl+O посмотреть пользовательский экран, реализована она неполноценно, например невозможно использовать граббер, не работают макросы http://bugs.farmanager.com/view.php?id=3523 Предлагаемый набор макросов даёт возможность полноценного просмотра пользовательского экрана из любой области. По желанию отдельные области можно исключить, перечислив их в параметре "exclude". Если активное окно немодально, то по нажатию Ctrl+O происходит переключение в окно Desktop. Если модально, то для просмотра используются функции GetUserScreen/SetUserScreen. Обратно можно вернуться нажав Ctrl+O, Esc или Ctrl+Tab.
  1. local Info = Info or package.loaded.regscript or function(...) return ... end --luacheck: ignore 113/Info
  2. local nfo = Info { _filename or ...,
  3.   name        = "Ctrl+O ultimate";
  4.   description = "View UserScreen from any area";
  5.   version     = "0.3"; --http://semver.org/lang/ru/
  6.   author      = "jd";
  7.   url         = "https://forum.farmanager.com/viewtopic.php?f=15&t=10983";
  8.   id          = "0698713F-35CF-4B47-98E4-C281E700C7DF";
  9.   minfarversion = {3,0,0,5067,0}; --desktop
  10.   helpstr = [[
  11. Хотя в редакторе/вьювере "из коробки" заявлена возможность по Ctrl+O посмотреть
  12. пользовательский экран, реализована она неполноценно, например невозможно использовать
  13. граббер, не работают макросы http://bugs.farmanager.com/view.php?id=3523
  14.  
  15. Предлагаемый набор макросов даёт возможность полноценного просмотра пользовательского экрана
  16. из любой области.
  17. По желанию отдельные области можно исключить, перечислив их в параметре "exclude".
  18.  
  19. Если активное окно немодально, то по нажатию Ctrl+O происходит переключение в окно Desktop.
  20. Если модально, то для просмотра используются функции GetUserScreen/SetUserScreen.
  21. Обратно можно вернуться нажав Ctrl+O, Esc или Ctrl+Tab.
  22.   ]];
  23.   help        = function(nfo) far.Message(nfo.helpstr,nfo.name,nil,"l") end;
  24.   options     = {
  25.     exclude = "Grabber ShellAutoCompletion DialogAutoCompletion";
  26.   };
  27.   --disabled    = true;
  28. }
  29. if not nfo or nfo.disabled then return end
  30. local O = nfo.options
  31.  
  32. local Exclude = {}
  33. if O.exclude and type(O.exclude=="string") then
  34.   for area in O.exclude:gmatch"%S+" do Exclude[area] = true end
  35. end
  36.  
  37. local F = far.Flags
  38. local actl,          GetWindowInfo,       SetCurrentWindow
  39.     = far.AdvControl,F.ACTL_GETWINDOWINFO,F.ACTL_SETCURRENTWINDOW
  40.  
  41. local function isModal(wi)
  42.   return band(wi.Flags,F.WIF_MODAL)~=0
  43. end
  44.  
  45. -- 0003523: Полноценный просмотр пользовательского экрана в редакторе/вьювере
  46. -- http://bugs.farmanager.com/view.php?id=3523
  47.  
  48. Macro { description="CtrlO: view UserScreen from any area";
  49.   area="Common"; key="CtrlO"; priority=40;
  50.   id="51E14530-08AA-4134-9488-4AD5EF8B6EDE";
  51.   condition=function()
  52.     return not Exclude[Area.Current]
  53.        and actl(GetWindowInfo).Type~=F.WTYPE_PANELS
  54.   end;
  55.   action=function()
  56.     local wi = actl(GetWindowInfo)
  57.     if isModal(wi) then
  58.       panel.GetUserScreen(nil,1)
  59.     else
  60.       for i=1,wi.Pos-1 do
  61.         if actl(GetWindowInfo,i).Type==F.WTYPE_DESKTOP then
  62.           actl(SetCurrentWindow,i)
  63.           return
  64.         end
  65.       end
  66.     end
  67.   end;
  68. }
  69.  
  70. -- 0003496: Desktop: реализовать выход по Esc/Ctrl-O
  71. -- http://bugs.farmanager.com/view.php?id=3496
  72.  
  73. Macro { description="CtrlO/Esc - quit Desktop";
  74.   area="Desktop"; key="Esc CtrlTab CtrlO"; priority=45;
  75.   id="6AB9F806-45E5-46E2-8146-8136CC2F275D";
  76.   action=function()
  77.     local wi = actl(GetWindowInfo)
  78.     if isModal(wi) then
  79.       panel.SetUserScreen(nil,1)
  80.     else
  81.       actl(SetCurrentWindow,wi.Pos-1)
  82.     end
  83.   end;
  84. }
Опции можно изменить в начале скрипта.

А чтобы после каждого обновления не приходилось вручную восстанавливать изменённые значения опций рекомендуется использовать возможности cfgscript из пакета ScriptsBrowser.
Attachments
CtrlO.lua
(3.43 KiB) Downloaded 21 times
Last edited by John Doe on Fri 21 Sep, 2018 15:49, edited 2 times in total.

siberia-man
Posts: 86
Joined: Sat 28 Jun, 2014 23:07
Has thanked: 1 time
Been thanked: 3 times

Ctrl-O: просмотр пользовательского экрана из любой области

Post by siberia-man » Wed 01 Nov, 2017 05:01

Пока не проверял, но описание впечатляет. Так можно было бы некоторый "изкоробочный" функционал ФАРа полностью вывести из самого ФАРа в хорошо отлаженные макросы.

Думаю, это было бы на пользу -- и функционал сохраняется, и кодовая база сокращается.

User avatar
John Doe
Бюрократ
Posts: 11855
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 26 times
Been thanked: 131 times

Ctrl-O: просмотр пользовательского экрана из любой области

Post by John Doe » Fri 21 Sep, 2018 15:51

Небольшое обновление.
- при использовании в модальных областях теперь нет ненужного перевода строки на пользовательском экране
- косметика в коде

Post Reply

Return to “Обсуждение макросов”