Page 4 of 7

RecentScreens — переключение между окнами как в MS Windows™

Posted: Tue 09 Apr, 2013 13:02
by John Doe
В большинстве приложений, которые я использую, переключение между окнами происходит в порядке их использования (MRU order).
Но не во всех, пример исключений: FAR manager, Google Chrome.
Для решения этой проблемы в фаре был когда-то такой плагинчик RecentScreens — меню «Экраны» в порядке использования

Вашему вниманию предлагается LuaMacro-реализация подобной функциональности.

Переключение окон-экранов по умолчанию заменяет LCtrlTab (только левый Ctrl).
В отличии от обычного переключения экранов — в процессе переключения может отображаться список окон (до тех пор, пока удерживается Ctrl).



Требуется FAR3 build 5547 или новее.

[download] https://chiselapp.com/user/johnd0e/repo ... creens.lua

Re: RecentScreens — переключение между окнами как в MS Windo

Posted: Tue 23 Apr, 2013 21:39
by Shmuel

Latest post of the previous page:

Code: Select all

local switchInstant = S.switchInstant==nil and true or S.switchInstant
"and true" - лишнее.

Code: Select all

local Lock = { ['Num']=0, ['Caps']=1, ['Scroll']=2 }
Можно короче:

Code: Select all

local Lock = { Num=0, Caps=1, Scroll=2 }

Re: RecentScreens — переключение между окнами как в MS Windo

Posted: Tue 23 Apr, 2013 21:41
by John Doe

Code: Select all

local switchInstant = S.switchInstant==nil and true or S.switchInstant
"and true" - лишнее.
Не совсем так.
true выступает как дефолтное значение, применяемое при отсутствии записи в базе.

А со вторым однозначно перемудрил )

Re: RecentScreens — переключение между окнами как в MS Windo

Posted: Tue 23 Apr, 2013 21:48
by Shmuel
John Doe wrote:

Code: Select all

local switchInstant = S.switchInstant==nil and true or S.switchInstant
"and true" - лишнее.
Не совсем так.
true выступает как дефолтное значение, применяемое при отсутствии записи в базе.
А вы подумайте ещё.

Re: RecentScreens — переключение между окнами как в MS Windo

Posted: Tue 23 Apr, 2013 21:54
by John Doe
Что тут думать, вы безусловно правы в том, что СЕЙЧАС его можно безболезненно отбросить, упростив таким образом выражение.
Но представьте, что там не значение, а переменная switchInstantDefault

Re: RecentScreens — переключение между окнами как в MS Windo

Posted: Tue 23 Apr, 2013 21:55
by John Doe
Есть подозрение, что опция "задержка меню" избыточна.
И вместо неё стоит сделать что-либо попроще, например:
- появление меню после второго нажатия CtrlTab
- отдельный хоткей для переключения с отображением списка (CtrlCapsLock)
- ...

Какие будут мнения?

Re: RecentScreens — переключение между окнами как в MS Windo

Posted: Tue 23 Apr, 2013 21:59
by Shmuel
John Doe wrote:Но представьте, что там не значение, а переменная switchInstantDefault
В этом случае согласен.

Re: RecentScreens — переключение между окнами как в MS Windo

Posted: Wed 24 Apr, 2013 03:50
by IgorZ
John Doe wrote:Есть подозрение, что опция "задержка меню" избыточна.
И вместо неё стоит сделать что-либо попроще, например:
- появление меню после второго нажатия CtrlTab
- отдельный хоткей для переключения с отображением списка (CtrlCapsLock)
- ...

Какие будут мнения?
Отдельный хоткей лично мне был бы удобнее. Может, настройку вариантов поведения сделать, если будут и другие пожелания?

Re: RecentScreens — переключение между окнами как в MS Windo

Posted: Wed 24 Apr, 2013 09:26
by John Doe
IgorZ wrote:Отдельный хоткей лично мне был бы удобнее. Может, настройку вариантов поведения сделать, если будут и другие пожелания?
Есть хоткей для открытия меню - CtrlF12. Не оно?

Тогда выключите в настройках отображение списка, и добавьте ещё один макрос на отдельный хоткей (CtrlCapsLock)
  1. Macro { description="[RecentScreens] switch (show list)";
  2.  
  3.   area=allScreens; key="/^LCtrl(Shift)?CapsLock$/";
  4.  
  5.   action=function()
  6.  
  7.     local w = getWindow()
  8.  
  9.     if w.Type==F.WTYPE_PANELS then Pop(makeUniqueId("Panels",0)) end
  10.  
  11.     getWindowById:Init()
  12.  
  13.     if band(w.Flags,F.WIF_MODAL) ~= 0 then showRecentScreens(1,"modal"); return end
  14.  
  15.     local pos = new_pos(1,akey(1):gsub("CapsLock","Tab"))
  16.  
  17.     stopMonitoring = true
  18.  
  19.       pos = showRecentScreens(pos)
  20.  
  21.       Pos = getWindowById[Screens[pos]].Pos
  22.  
  23.       Pop(Screens[pos])
  24.  
  25.       gotoWindow(Pos)
  26.  
  27.     stopMonitoring = false
  28.  
  29.     LockState("Caps",0)
  30.  
  31.   end;
  32.  
  33. }
Через пару дней сообщите, удобно ли это, и всё ли работает ожидаемым образом.
Есть ещё один момент: после того, как вы начали переключение CtrlTab (без списка), но до того, как вы отпустите Ctrl, вам тоже может понадобиться отобразить меню. CtrlF12 в этом случае сработает, а CtrlCapsLock - нет. Надо ли?

Re: RecentScreens — переключение между окнами как в MS Windo

Posted: Wed 24 Apr, 2013 10:19
by John Doe
Обнаружилась проблема при переключении между редактором/вьювером с помощью F6.
А потом при выходе из файла и фар падает...

Re: RecentScreens — переключение между окнами как в MS Windo

Posted: Wed 24 Apr, 2013 10:23
by 2useven10
подробнее можно ?

Re: RecentScreens — переключение между окнами как в MS Windo

Posted: Wed 24 Apr, 2013 10:28
by John Doe
Установить скрипт, открыть файл, нажать F6, полюбоваться на красное окошко (это мой ассерт, так что нормально), попытаться закрыть файл, получить трап.

Но это ещё не багрепорт, позже дам минимальный макрос для воспроизведения трапа.

RecentScreens — переключение между окнами как в MS Windo

Posted: Wed 24 Apr, 2013 11:02
by John Doe
1. Если в редакторе нажать F6, то событие VE_READ приходит раньше чем EE_CLOSE.
Во вьювере вероятно аналогично, нажать F6, то событие EE_READ приходит раньше чем VE_CLOSE.

2.Если во время EE_CLOSE/VE_CLOSE вызвать far.AdvControl (F.ACTL_GETWINDOWINFO), то вернётся nil

(Падает в обоих случаях, что вызывает трап ещё не выяснил)

P.S.
Приложил коллекцию сегодняшних трапов, они отличаются
<удалено>

Re: RecentScreens — переключение между окнами как в MS Windo

Posted: Wed 24 Apr, 2013 11:37
by John Doe
Разобрался.
Проблема вызвана самим выводом сообщений во время событий закрытия редактора/вьювера.
Проявляется только при переходе через F6.
Вот минимум для воспроизведения:
  1. Event{ group="EditorEvent";
  2.  
  3.   condition=function(id,Event) return Event==far.Flags.EE_CLOSE end;
  4.  
  5.   action=msgbox
  6.  
  7. }
  8.  
  9. Event{ group="ViewerEvent";
  10.  
  11.   condition=function(id,Event) return Event==far.Flags.VE_CLOSE end;                            
  12.  
  13.   action=msgbox
  14.  
  15. }
Любой из этих двух макросов приводит к трапу при выходе из редактора/вьювера.

Re: RecentScreens — переключение между окнами как в MS Windo

Posted: Wed 24 Apr, 2013 11:41
by t-rex
и само собой до 3348 не повторяется? или это у меня уже паранойя?

Re: RecentScreens — переключение между окнами как в MS Windo

Posted: Wed 24 Apr, 2013 11:47
by John Doe
Повторяется и раньше (проверил в 3291)

Re: RecentScreens — переключение между окнами как в MS Windo

Posted: Wed 24 Apr, 2013 11:49
by t-rex
и то хорошо. но вообще при обработке этих эвентов не стоит выводить ничего интерактивного.