Чтобы активировать другое окно, правильное действие на уровне протокола Xlib - отправить сообщение _NET_ACTIVE_WINDOW, как описано в спецификации EWMH.
http://standards.freedesktop.org/wm-spec/wm-spec-1.3.html
Это можно сделать с помощью python-xlib (предположительно) или с помощью gdk_window_focus () в чужом GdkWindow, используя GDK через pygtk
_NET_ACTIVE_WINDOW превосходит XRaiseWindow () и много лет работал во всех важных WM.
Вам следует избегать XSetInputFocus (), который вызовет проблемы (особенно, если вы неправильно указали метку времени). Проблема в том, что WM не может перехватить SetInputFocus (), поэтому он вызывает странные условия гонки и несоответствия пользовательского интерфейса.
Действительно только _NET_ACTIVE_WINDOW работает должным образом, именно поэтому он был изобретен, потому что предыдущие хаки были плохими.
Существует библиотека libwnck, которая позволит вам активировать окна (помимо прочего), но, к сожалению, она добавляет много накладных расходов, потому что она всегда отслеживает все открытые окна из любого приложения, даже если вам это не нужно , Однако, если вы хотите отслеживать окна из других приложений в любом случае , то в libwnck есть функция для активации этих окон, которая делает правильные вещи и будет хорошим выбором.
Строго правильный подход - проверить поддержку EWMH _NET_ACTIVE_WINDOW (документ EWMH описывает, как это сделать) и вернуться к XRaiseWindow, если у WM нет _NET_ACTIVE_WINDOW. Однако, поскольку любая WM, над которой активно работали в последние годы, имеет EWMH, многие люди лениво относятся к запасным вариантам для устаревших WM.