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

Столкнулись с проблемой в использовании макросов? Здесь можно получить помощь.
Post Reply
buniak_a_h
Posts: 1859
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 118 times
Been thanked: 165 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 3 times

buniak_a_h
Posts: 1859
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 118 times
Been thanked: 165 times
Contact:

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

Post by buniak_a_h »

P/S. Есть ли у окна некая постоянная и уникальная характеристика (типа хендла, ID-а)? Увы, Id - не уникальная, как оказалось (у первого в сессии редактора Id=0, и такой же Id у панелей, у десктопа, возможно ещё у кого…). Можно ли быть уверенным, что пара {Type; Id} - уникальна и постоянна? Утилизируются ли (используются ли вторично) Id-ы окон редакторов, вьюеров и диалогов?

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

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

Post by John Doe »

См. RecentScreens
https://t.me/FarManager — Telegram чат

buniak_a_h
Posts: 1859
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 118 times
Been thanked: 165 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-е место?

buniak_a_h
Posts: 1859
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 118 times
Been thanked: 165 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.

buniak_a_h
Posts: 1859
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 118 times
Been thanked: 165 times
Contact:

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

Post by buniak_a_h »

Вопрос действительно снят.
Если кому надо, привожу три функции и пример переключения/восстановления
  1. -- Сохранение позиций окон
  2.  local function SaveWinOrder()
  3.   local WO, n = {}, far.AdvControl(F.ACTL_GETWINDOWCOUNT)
  4.   local Wi
  5.   for i=1,n do
  6.    Wi = far.AdvControl(F.ACTL_GETWINDOWINFO, i)
  7.    WO[#WO+1] = Wi.Type .. ';' .. tostring(Wi.Id)
  8.   end
  9.   return WO
  10.  end -- SaveWinOrder
  11.  -- Переключение окна по uin
  12.  local function SetWin(Uin, Imm)
  13.   local n = far.AdvControl(F.ACTL_GETWINDOWCOUNT)
  14.   local Wi
  15.   for i=1,n do
  16.    Wi = far.AdvControl(F.ACTL_GETWINDOWINFO, i)
  17.    if Wi.Type .. ';' .. tostring(Wi.Id)  == Uin then
  18.     far.AdvControl(F.ACTL_SETCURRENTWINDOW, Wi.Pos)
  19.     if Imm then
  20.      far.AdvControl(F.ACTL_COMMIT);
  21.      far.AdvControl(F.ACTL_REDRAWALL);
  22.     end
  23.     break
  24.    end
  25.   end
  26.  end -- SetWin
  27.  -- Восстановление порядка окон
  28.  local function RestoreWin()
  29.   for _,v in ipairs(WinOrder) do
  30.    SetWin(v, false)
  31.    far.AdvControl(F.ACTL_COMMIT)
  32.   end
  33.  end -- RestoreWin
  34.  -- Пример использования
  35.  -- Запоминание порядка окон
  36.  local WinOrder = SaveWinOrder()
  37.  -- Переключение на DeskTop
  38.  SetWin(far.Flags.WTYPE_DESKTOP .. ';0', true)
  39.  -- Делаем что-то
  40. -- ................................
  41.  -- Восстанавливаю порядок окон
  42.  RestoreWin(WinOrder)

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

Запомнить и восстановить 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: 12829
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 288 times

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

Post by John Doe »

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

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

В рамках текущего апи можно было бы добавить новое поле, uid, с каким-то из типов соответствующих беззнаковому целому.
https://t.me/FarManager — Telegram чат

buniak_a_h
Posts: 1859
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 118 times
Been thanked: 165 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: 12829
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 288 times

Запомнить и восстановить 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 чат

buniak_a_h
Posts: 1859
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 118 times
Been thanked: 165 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: 12829
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 38 times
Been thanked: 288 times

Запомнить и восстановить 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 чат

buniak_a_h
Posts: 1859
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 118 times
Been thanked: 165 times
Contact:

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

Post by buniak_a_h »

John Doe wrote:
Mon 04 May, 2020 11:28
Хотите намакросить собственное особое поведение - используйте событие потери фокуса окном, и делайте в этом случае что угодно (возвращайте в позицию 0).
Но делать это при любом CtrlTab по меньшей мере странно.
Я и не делаю. Это - искаробочное поведение ФАРа.

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

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

Post by John Doe »

Фар ничего не возвращает в "позицию 0".
Единственное что делается по CtrlTab - переход из десктопа в панели
https://t.me/FarManager — Telegram чат

buniak_a_h
Posts: 1859
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 118 times
Been thanked: 165 times
Contact:

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

Post by buniak_a_h »

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

Post Reply

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