Запомнить и восстановить z-порядок окон Topic is solved

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
Post Reply
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Запомнить и восстановить z-порядок окон

Post by buniak_a_h »

Извините, поиском не нашёл; вероятно такую задачу кто-то решал.
Требуется: запомнить z-order окон, переключиться в конкретное (например, в desktop), затем восстановить. Простым переключением эта задача не решается, т.к. после восстановления следующим в z-порядке будет desktop. Т.е. внешне, вроде, всё замечательно, но реакция на CtrlTab неожиданно для пользователя опять переключает его на desktop (а на нём - чернота и даже курсора нету - полная имитация "мёртвого" зависания; у юзера - шок).
Для примера привожу небольшой макрос, который я использую для подбора цвета в редакторе. Макрос по любой клавише перебирает цвета, выводит текст в этом цвете их на экран консоли, по Esc и Enter возвращается в редактор (по Enter заносит цвет в текущую позицию редактора). Увы, после закрытия редактора восстанавливается desktop ...

Color.lua
(1.11 KiB) Downloaded 50 times
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Запомнить и восстановить z-порядок окон

Post by buniak_a_h »

P/S. Есть ли у окна некая постоянная и уникальная характеристика (типа хендла, ID-а)? Увы, Id - не уникальная, как оказалось (у первого в сессии редактора Id=0, и такой же Id у панелей, у десктопа, возможно ещё у кого…). Можно ли быть уверенным, что пара {Type; Id} - уникальна и постоянна? Утилизируются ли (используются ли вторично) Id-ы окон редакторов, вьюеров и диалогов?
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Запомнить и восстановить z-порядок окон

Post by John Doe »

См. RecentScreens
https://t.me/FarManager — Telegram чат
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Запомнить и восстановить z-порядок окон

Post by buniak_a_h »

John Doe, спасибо, ответ на 2-й вопрос получен.
Посмотрел Ваш скрипт; там в качестве uid окна используется как раз сочетание Type и Id. Непонятно мне, зачем использовать некий массив En, который (в определённой части) совпадает с TypeName . Кстати, а почему в En нет Dialog? есть же немодальные диалоги …
Насчёт первого вопроса: не хочется вешать макрос "навсегда". Есть конкретная ситуация, в которой надо переключиться на окно (можно даже постановить, что в изначальном порядке оно - последнее в z-последовательности), а затем "засунуть" его обратно, не трогая порядок других окон.
Кстати, с этим desktop-ом вообще странности: так просто (перебором CtrlTab на него не переключиться (из того же редактора, например), а при закрытии редактора оно вылезает. Нелогичность какая-то…
Сделал маленький макрос, выводящий список окон. Так вот: после возврата desktop на предпоследем месте, а если хоть раз переключиться по CtrlTab туда-обратно - встаёт на своё "постоянное" место (0-е). Т.е. задача немного изменилась:есть ли возможность в скрипте, не меняя порядок других окон, "засунуть" текущее окно на 0-е место?
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Запомнить и восстановить z-порядок окон

Post by buniak_a_h »

P/S. Можно, конечно, в цикле пробежаться по всем окнам, последовательно переключаясь на каждое в исходном порядке. Просто опасаюсь, что юзера от такого мельтешения укачает …
UPD Не заметил сразу замечание
Переключение не произойдёт до тех пор, пока не будет вызвана команда ACTL_COMMIT или пока Far Manager не получит управление.
Вопрос, наверно, снят …
Last edited by buniak_a_h on Mon 04 May, 2020 01:50, edited 1 time in total.
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Запомнить и восстановить z-порядок окон

Post by buniak_a_h »

Вопрос действительно снят.
Если кому надо, привожу три функции и пример переключения/восстановления
  1. -- Сохранение позиций окон
  2.  
  3.  local function SaveWinOrder()
  4.  
  5.   local WO, n = {}, far.AdvControl(F.ACTL_GETWINDOWCOUNT)
  6.  
  7.   local Wi
  8.  
  9.   for i=1,n do
  10.  
  11.    Wi = far.AdvControl(F.ACTL_GETWINDOWINFO, i)
  12.  
  13.    WO[#WO+1] = Wi.Type .. ';' .. tostring(Wi.Id)
  14.  
  15.   end
  16.  
  17.   return WO
  18.  
  19.  end -- SaveWinOrder
  20.  
  21.  -- Переключение окна по uin
  22.  
  23.  local function SetWin(Uin, Imm)
  24.  
  25.   local n = far.AdvControl(F.ACTL_GETWINDOWCOUNT)
  26.  
  27.   local Wi
  28.  
  29.   for i=1,n do
  30.  
  31.    Wi = far.AdvControl(F.ACTL_GETWINDOWINFO, i)
  32.  
  33.    if Wi.Type .. ';' .. tostring(Wi.Id)  == Uin then
  34.  
  35.     far.AdvControl(F.ACTL_SETCURRENTWINDOW, Wi.Pos)
  36.  
  37.     if Imm then
  38.  
  39.      far.AdvControl(F.ACTL_COMMIT);
  40.  
  41.      far.AdvControl(F.ACTL_REDRAWALL);
  42.  
  43.     end
  44.  
  45.     break
  46.  
  47.    end
  48.  
  49.   end
  50.  
  51.  end -- SetWin
  52.  
  53.  -- Восстановление порядка окон
  54.  
  55.  local function RestoreWin()
  56.  
  57.   for _,v in ipairs(WinOrder) do
  58.  
  59.    SetWin(v, false)
  60.  
  61.    far.AdvControl(F.ACTL_COMMIT)
  62.  
  63.   end
  64.  
  65.  end -- RestoreWin
  66.  
  67.  -- Пример использования
  68.  
  69.  -- Запоминание порядка окон
  70.  
  71.  local WinOrder = SaveWinOrder()
  72.  
  73.  -- Переключение на DeskTop
  74.  
  75.  SetWin(far.Flags.WTYPE_DESKTOP .. ';0', true)
  76.  
  77.  -- Делаем что-то
  78.  
  79. -- ................................
  80.  
  81.  -- Восстанавливаю порядок окон
  82.  
  83.  RestoreWin(WinOrder)
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Запомнить и восстановить z-порядок окон

Post by John Doe »

buniak_a_h wrote: Mon 04 May, 2020 01:17 Непонятно мне, зачем использовать некий массив En, который (в определённой части) совпадает с TypeName
TypeName зависит от языка, но насколько я помню En скорее фильтром выступает (игнорируется то что там не перечислено).
buniak_a_h wrote: Mon 04 May, 2020 01:17 а почему в En нет Dialog
В моей версии есть.
buniak_a_h wrote: Mon 04 May, 2020 01:17 а затем "засунуть" его обратно, не трогая порядок других окон.
Если вам действительно необходимо восстановить точный порядок (зачем?), то какого-то прямого способа нет, только поочерёдным переходом в каждое из окон.
(Вижу, что вы уже разобрались, но вопрос "зачем" остаётся)
buniak_a_h wrote: Mon 04 May, 2020 01:17 Кстати, с этим desktop-ом вообще странности:
Не должно быть.
buniak_a_h wrote: Mon 04 May, 2020 01:32 Переключение не произойдёт до тех пор, пока не будет вызвана команда ACTL_COMMIT или пока Far Manager не получит управление.
Это замечание устарело.
https://t.me/FarManager — Telegram чат
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Запомнить и восстановить z-порядок окон

Post by John Doe »

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

Считаю что в структуре WindowInfo не хватает уникального идентификатора окна.
Казалось бы можно сделать уникальным значение intptr_t Id;, применив сквозную нумерацию редакторов/вьюверов.
Однако, для диалогов в этом поле используется указатель (что порождает некоторые сложности само по себе, но это отдельная тема).

В рамках текущего апи можно было бы добавить новое поле, uid, с каким-то из типов соответствующих беззнаковому целому.
https://t.me/FarManager — Telegram чат
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Запомнить и восстановить z-порядок окон

Post by buniak_a_h »

John Doe wrote: Mon 04 May, 2020 07:55
buniak_a_h wrote: Mon 04 May, 2020 01:17 а почему в En нет Dialog
В моей версии есть.
Скрипт скачал с форума сегодня ночью. Не было.
John Doe wrote: Mon 04 May, 2020 07:55 … восстановить точный порядок (зачем?), то …
(Вижу, что вы уже разобрались, но вопрос "зачем" остаётся)
Ну, например, чтобы можно было в скриптах просто переключаться туда-обратно в макросах посылкой CtrlTab. У меня есть пара скриптов (связанных, в основном, с компиляцией), где изменение порядка окон может оказаться фатальным.
John Doe wrote: Mon 04 May, 2020 07:55
buniak_a_h wrote: Mon 04 May, 2020 01:17 Кстати, с этим desktop-ом вообще странности:
Не должно быть.
Я описал. Можете попробовать мой скрипт. Если просто закрыть редактор, то попадаешь на DeskTop, а если переключиться по CtrlTab - то он становится 0-м окном и из переключения исключается.
John Doe wrote: Mon 04 May, 2020 07:55
buniak_a_h wrote: Mon 04 May, 2020 01:32 Переключение не произойдёт до тех пор, пока не будет вызвана команда ACTL_COMMIT или пока Far Manager не получит управление.
Это замечание устарело.
Это - не моё замечание, а цитата из поставляемой документации (%FarHome%\Encyclopedia\FarEncyclopedia.ru.chm:\html\service_functions\advcontrol.html). Версия ФАРа 5591.
John Doe wrote: Mon 04 May, 2020 09:26 Переключение окон сейчас завязано на их позицию, и это немного через задницу.
Хотелось бы от этого уйти.
Я Вас понимаю. Тем более не понимаю, зачем нужно поле Pos, если оно повторяет номер, указанный в вызове ACTL_GETWINDOWINFO (я проверил - действительно повторяет. Раньше, мне кажется, не повторяло).
С Id-ом диалогового окна там действительно не совсем удобно: один и тот же диалог (например, поиск по AltF7), вызванный подряд, выдаёт один и тот же Id. Однако, если между вызовами вывести другой диалог, то Id-ы будут разные. Но это не особо актуально: (а)немодальные диалоги это пока экзотика и (б) для немодальных диалогов Id-ы будут разные для разных экземпляров (не проверено; вывод по логике)
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Запомнить и восстановить z-порядок окон

Post by John Doe »

buniak_a_h wrote: Mon 04 May, 2020 10:19 Ну, например, чтобы можно было в скриптах просто переключаться туда-обратно в макросах посылкой CtrlTab.
Зачем же вам теперь CtrlTab когда вы уже написали более надёжную функцию.
buniak_a_h wrote: Mon 04 May, 2020 10:19 Я описал. Можете попробовать мой скрипт.
Зачем же сюда потенциально ошибочный скрипт вмешивать.
Давайте по шагам, без скриптов.
Описанное вами поведение возможно только если вы зачем-то в Desktop переключались.
buniak_a_h wrote: Mon 04 May, 2020 10:19 Это - не моё замечание, а цитата из поставляемой документации
И тем не менее.
https://t.me/FarManager — Telegram чат
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Запомнить и восстановить z-порядок окон

Post by buniak_a_h »

John Doe wrote: Mon 04 May, 2020 11:03 Зачем же вам теперь CtrlTab когда вы уже написали более надёжную функцию.
Уже написано. Давно…
John Doe wrote: Mon 04 May, 2020 11:03 Описанное вами поведение возможно только если вы зачем-то в Desktop переключались.
Наверно. Я ж писал: Desktop какое-то другое (сильно отличное от остальных видов) окно. Удобно, что при любом CtrlTab оно становится 0-м и исключается из ротации. Но ощущение, что не доделано: надо было уж сделать так, чтоб при потере фокуса любым способом это окно уходило в 0-ю позицию. Похоже на неполноту реализации…
--
Про ACTL_COMMIT - не понял. Ну, устарело - значит, я это делаю зря. Не помешает. Мельтешения окон не видно - уже хорошо. Хотя как сделано -непонятно. Может, дело в ACTL_REDRAWALL ?
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Запомнить и восстановить z-порядок окон

Post by John Doe »

buniak_a_h wrote: Mon 04 May, 2020 11:16 Удобно, что при любом CtrlTab оно становится 0-м и исключается из ротации.
Нет в этом удобства. Если вы зачем-то открывали Desktop - значит это было нужно.

Хотите намакросить собственное особое поведение - используйте событие потери фокуса окном, и делайте в этом случае что угодно (возвращайте в позицию 0).
Но делать это при любом CtrlTab по меньшей мере странно.
buniak_a_h wrote: Mon 04 May, 2020 11:16 Про ACTL_COMMIT - не понял.

Code: Select all

zg 28.06.2015 02:50:26 +0200 - build 4396

1. ACTL_SETCURRENTWINDOW, VCTL_QUIT и ECTL_QUIT выполняются сразу.

2. ACTL_COMMIT ничего не делает и оставлена для совместимости.
https://t.me/FarManager — Telegram чат
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Запомнить и восстановить z-порядок окон

Post by buniak_a_h »

John Doe wrote: Mon 04 May, 2020 11:28 Хотите намакросить собственное особое поведение - используйте событие потери фокуса окном, и делайте в этом случае что угодно (возвращайте в позицию 0).
Но делать это при любом CtrlTab по меньшей мере странно.
Я и не делаю. Это - искаробочное поведение ФАРа.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

Запомнить и восстановить z-порядок окон

Post by John Doe »

Фар ничего не возвращает в "позицию 0".
Единственное что делается по CtrlTab - переход из десктопа в панели
https://t.me/FarManager — Telegram чат
User avatar
buniak_a_h
Posts: 4236
Joined: Sat 20 Apr, 2013 00:17
Location: Санкт-Петробад
Has thanked: 222 times
Been thanked: 643 times
Contact:

Запомнить и восстановить z-порядок окон

Post by buniak_a_h »

John Doe, я понял, в чём "странность"
При закрытии редактора ожидается то же самое окно, что и по CtrlShiftTab (т.е. "предыдущее"). А на самом деле при закрытии открывается действительно предыдущее, а по CtrlShiftTab - окно, находящееся в списке окон (получаемом по F12) выше нынешнего.
Post Reply

Return to “Нужна помощь”