Хотя мода на хвастовство линуксовыми десктопами давно прошла, я все же продолжаю время от времени допиливать свой любимый FVWM. Например, недавно сделал себе на рабочей машине двухэтажные десктопы/воркплейсы — разбил каждый виртуальный рабочий стол на две страницы и в итоге заимел в два раза больше рабочего пространства. Было удобно, стало еще удобнее — теперь можно окна раскидывать по страницам и почти не париться их перекрытием (чем дальше, тем больше мне нравится, когда все окна на виду, тайлинг — форева). Но всю малину портила одна мелочь - фокус ввода был един для всего десктопа, но не для каждой его страницы
Проявлялось это так: я нахожусь на одной странице, начинаю набирать что-то на клавиатуре и обнаруживаю, что ввожу данные в другое окно — которое даже не вижу. Некоторое время я терпел это, но потом решил поискать решение. FVWM — штука мощная, сомнений, что проблему можно решить у меня не было.
Так и получилось, решение нашлось быстро и оказалось довольно простым:
# Remember focused window in current page
DestroyFunc SavePageFocus
AddToFunc SavePageFocus
+ I All (CurrentPage) State $[FocusPage] False
+ I Current State $[FocusPage] True
# Restore previous focused window in current page
DestroyFunc RestorePageFocus
AddToFunc RestorePageFocus
+ I Current (CurrentPage) Break 1
+ I Next (CurrentPage, State $[FocusPage]) Focus
+ I None (CurrentPage, Focused) Prev (CurrentPage) Focus
*FvwmEvent: Cmd
*FvwmEvent: new_page RestorePageFocus
*FvwmEvent: new_desk RestorePageFocus
*FvwmEvent: focus_change SavePageFocus
И в функцию StartFunction добавилась строчка загрузки модуля:
+ I Module FvwmEvent
Теперь фокус запоминается при клике на окно и неудобства исчезли.