# focus

Управление фокусом ввода.

## СИНТАКСИС

          focus
          focus окно
          focus параметр арг арг ...

## ОПИСАНИЕ

Команда focus используется для управления фокусом ввода Tk. В любой момент времени одно из окон на каждом экране находится в фокусе ввода; всякое событие нажатия или отпускания клавиши интерпретируются в этом окне. Обычно переключение фокуса между окнами верхнего уровня на экране осуществляется менеджером окон. Например, некоторые менеджеры окон автоматически переключают фокус на окно верхнего уровня, как только на него попадает курсор Мыши; другие устанавливают фокус только при щелчке на окне. Обычно менеджер окон устанавливает фокус только на окнах верхнего уровня, а переключением фокуса между подчиненными окнами занимается конкретное приложение.

Для каждого верхнего уровня Tk запоминает одно окно в фокусе (последнего наследника данного верхнего уровня, в которое попал фокус); когда менеджер окон переключает фокус на данный верхний уровень, Tk автоматически устанавливает его на запомненное окно. Внутри конкретного верхнего уровня Tk использует явное моделирование фокуса по умолчанию. Обычно перемещение курсора "Мыши" без изменения верхнего уровня не приводит к переключению фокуса; переключение происходит, лишь если его запросил примитив (например, в результате щелчка по кнопке "Мыши" ) или если пользователь нажал, например, клавишу Tab.

Неявная модель фокусировки создается процедурой Tcl tk_focusFollowsMouse; она меняет параметры конфигурации Tk таким образом, чтобы фокус устанавливался на окно при попадании на него курсора "Мыши".Процедуры Tcl tk_focusNext и tk_focusPrev устанавливают порядок переключения фокуса между окнами верхнего уровня. Эти процедуры определяют, помимо прочего, привязки по умолчанию к клавишам Tab и Shift-Tab.

Команда focus может принимать одну из следующих форм:

focus
  Возвращает имя пути окна в фокусе на дисплее, содержащем главное окно приложения, или пустую строку, если никакое окно данного приложения не находится в фокусе. Замечание: дисплей лучше указать явно с помощью параметра -displayof (см.ниже); в этом случае команда сможет работать и в приложениях, использующих несколько дисплеев.
focus окно
  Если одно из окон данного приложения находится в фокусе на дисплее окна, то команда устанавливает фокус ввода на окно и возвращает пустую строку. Если же у приложения не было фокуса ввода на дисплее окна, то окно будет запомнено как окно в фокусе для данного верхнего уровня. При попадании фокуса на данный верхний уровень в очередной раз Tk установит его на окно. Если аргументом является пустая строка, то команда не выполняет никаких действий.
focus -displayof окно
  Возвращает имя окна в фокусе на дисплее, содержащем окно. Если окно в фокусе на дисплее окна не принадлежит данному приложению, то команда возвращает пустую строку.
focus -force окно
  Устанавливает окно в фокус на дисплее окна, даже если у приложения нет фокуса ввода на этом дисплее. Эту команду следует использовать экономно или отказаться от его использования совсем. Обычно приложение не должно запрашивать для себя фокус самостоятельно, дожидаясь пока на него не переключит фокус менеджер окон. Если аргументом является пустая строка, то команда не выполняет никаких действий.
focus -lastfor окно
  Возвращает имя окна , последним получившим фокус ввода среди всех окон того же верхнего уровня, что и окно. Если ни на какое из окон данного верхнего уровня фокус не устанавливался или если окно, на которое фокус устанавливался последним, удалено, то команда возвращает имя верхнего уровня. Возвращаемое значение является именем окна, на котором будет установлен фокус ввода при следующей передаче фокуса на данный верхний уровень менеджером окна.

## ОСОБЕННОСТИ РЕАЛИЗАЦИИ

При получении фокуса ввода внутренним окном Tk фактически не устанавливает X фокус на это окно. X ведет себя таким образом, что фокус сохранится на окне верхнего уровня, которому подчиняется окно с фокусом. Однако Tk создает события FocusIn и FocusOut в точности, как если бы X фокус был на внутреннем окне. Такой подход порождает ряд трудностей при фактическом переключении X фокуса; то, что X фокус установлен на данный верхний уровень, незаметно, если не запрашивать X сервер непосредственно из C программы.