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

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

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

Post by John Doe »

Хотя в редакторе/вьювере "из коробки" заявлена возможность по 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.  
  3. local nfo = Info { _filename or ...,
  4.  
  5.   name        = "Ctrl+O ultimate";
  6.  
  7.   description = "View UserScreen from any area";
  8.  
  9.   version     = "0.3"; --http://semver.org/lang/ru/
  10.  
  11.   author      = "jd";
  12.  
  13.   url         = "https://forum.farmanager.com/viewtopic.php?f=15&t=10983";
  14.  
  15.   id          = "0698713F-35CF-4B47-98E4-C281E700C7DF";
  16.  
  17.   minfarversion = {3,0,0,5067,0}; --desktop
  18.  
  19.   helpstr = [[
  20.  
  21. Хотя в редакторе/вьювере "из коробки" заявлена возможность по Ctrl+O посмотреть
  22.  
  23. пользовательский экран, реализована она неполноценно, например невозможно использовать
  24.  
  25. граббер, не работают макросы http://bugs.farmanager.com/view.php?id=3523
  26.  
  27.  
  28.  
  29. Предлагаемый набор макросов даёт возможность полноценного просмотра пользовательского экрана
  30.  
  31. из любой области.
  32.  
  33. По желанию отдельные области можно исключить, перечислив их в параметре "exclude".
  34.  
  35.  
  36.  
  37. Если активное окно немодально, то по нажатию Ctrl+O происходит переключение в окно Desktop.
  38.  
  39. Если модально, то для просмотра используются функции GetUserScreen/SetUserScreen.
  40.  
  41. Обратно можно вернуться нажав Ctrl+O, Esc или Ctrl+Tab.
  42.  
  43.   ]];
  44.  
  45.   help        = function(nfo) far.Message(nfo.helpstr,nfo.name,nil,"l") end;
  46.  
  47.   options     = {
  48.  
  49.     exclude = "Grabber ShellAutoCompletion DialogAutoCompletion";
  50.  
  51.   };
  52.  
  53.   --disabled    = true;
  54.  
  55. }
  56.  
  57. if not nfo or nfo.disabled then return end
  58.  
  59. local O = nfo.options
  60.  
  61.  
  62.  
  63. local Exclude = {}
  64.  
  65. if O.exclude and type(O.exclude=="string") then
  66.  
  67.   for area in O.exclude:gmatch"%S+" do Exclude[area] = true end
  68.  
  69. end
  70.  
  71.  
  72.  
  73. local F = far.Flags
  74.  
  75. local actl,          GetWindowInfo,       SetCurrentWindow
  76.  
  77.     = far.AdvControl,F.ACTL_GETWINDOWINFO,F.ACTL_SETCURRENTWINDOW
  78.  
  79.  
  80.  
  81. local function isModal(wi)
  82.  
  83.   return band(wi.Flags,F.WIF_MODAL)~=0
  84.  
  85. end
  86.  
  87.  
  88.  
  89. -- 0003523: Полноценный просмотр пользовательского экрана в редакторе/вьювере
  90.  
  91. -- http://bugs.farmanager.com/view.php?id=3523
  92.  
  93.  
  94.  
  95. Macro { description="CtrlO: view UserScreen from any area";
  96.  
  97.   area="Common"; key="CtrlO"; priority=40;
  98.  
  99.   id="51E14530-08AA-4134-9488-4AD5EF8B6EDE";
  100.  
  101.   condition=function()
  102.  
  103.     return not Exclude[Area.Current]
  104.  
  105.        and actl(GetWindowInfo).Type~=F.WTYPE_PANELS
  106.  
  107.   end;
  108.  
  109.   action=function()
  110.  
  111.     local wi = actl(GetWindowInfo)
  112.  
  113.     if isModal(wi) then
  114.  
  115.       panel.GetUserScreen(nil,1)
  116.  
  117.     else
  118.  
  119.       for i=1,wi.Pos-1 do
  120.  
  121.         if actl(GetWindowInfo,i).Type==F.WTYPE_DESKTOP then
  122.  
  123.           actl(SetCurrentWindow,i)
  124.  
  125.           return
  126.  
  127.         end
  128.  
  129.       end
  130.  
  131.     end
  132.  
  133.   end;
  134.  
  135. }
  136.  
  137.  
  138.  
  139. -- 0003496: Desktop: реализовать выход по Esc/Ctrl-O
  140.  
  141. -- http://bugs.farmanager.com/view.php?id=3496
  142.  
  143.  
  144.  
  145. Macro { description="CtrlO/Esc - quit Desktop";
  146.  
  147.   area="Desktop"; key="Esc CtrlTab CtrlO"; priority=45;
  148.  
  149.   id="6AB9F806-45E5-46E2-8146-8136CC2F275D";
  150.  
  151.   action=function()
  152.  
  153.     local wi = actl(GetWindowInfo)
  154.  
  155.     if isModal(wi) then
  156.  
  157.       panel.SetUserScreen(nil,1)
  158.  
  159.     else
  160.  
  161.       actl(SetCurrentWindow,wi.Pos-1)
  162.  
  163.     end
  164.  
  165.   end;
  166.  
  167. }
Опции можно изменить в начале скрипта.

А чтобы после каждого обновления не приходилось вручную восстанавливать изменённые значения опций рекомендуется использовать возможности cfgscript из пакета ScriptsBrowser.
Attachments
CtrlO.lua
(3.43 KiB) Downloaded 161 times
Last edited by John Doe on Fri 21 Sep, 2018 15:49, edited 2 times in total.
siberia-man
Posts: 131
Joined: Sat 28 Jun, 2014 23:07
Has thanked: 2 times
Been thanked: 9 times

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

Post by siberia-man »

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

Думаю, это было бы на пользу -- и функционал сохраняется, и кодовая база сокращается.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

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

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