LINUX.ORG.RU

Как сделать модальное диалоговое окно в X11?

 , ,


0

1

Здравствуйте,

Мне требуется, чтобы диалоговое окно работало в модальном режиме, т.е. захватывало управление и не позволяло получать фокус другим окнам до момента своего закрытия. Можно ли такое поведение реализовать в X11? Самое просто, что приходит в голову это всем другим окнам приложения установить режим Disabled, но, как я понимаю, тут такого нет. Мои попытки использовать XGrabPointer() и XGrabKeyboard() вообще не дают какого-то результата - при щелчке по другому окну фокус ввода уходит к нему. Есть версия, что надо закрыть весь рабочий стол прозрачным окном типа InputOnly, чтобы оно принимало все сообщения будучи невидимым. И через него передавать события модальному окну. Либо закрыть все другие окна приложения такими же окнами с такими же размерами, чтобы они блокировали ввода имитирую Disabled. Но, честно говоря, такое «шаманство» как-то уж очень напоминает «костыли», на мой взгляд. В общем как это делается в X11?



Последнее исправление: Dimez (всего исправлений: 1)

Посмотрите как работают контекстные/панельные меню в различном ПО - там частокак раз такой эффект и достигается; насколько я помню через одну из Grab-функций

GPFault ★★★
()

Мои попытки использовать XGrabPointer() и XGrabKeyboard() вообще не дают какого-то результата - при щелчке по другому окну фокус ввода уходит к нему

Значит неправильные аргументы применял. XGrabPointer может полностью захватить мышь, чтобы щелчки куда угодно приходили только тебе.

Я вот такое использовал, но почему аргументы именно такие уже не помню. Из мана не очень понятно за что второй отвечает например.

XGrabPointer(display, rootwin, True, ButtonPressMask|PointerMotionMask, GrabModeAsync, GrabModeAsync, None, None, CurrentTime);

firkax ★★★★★
()
Ответ на: комментарий от firkax

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

firkax ★★★★★
()

В примерах кода к Motif, помню, были и «system modal», и «application modal».

Не совсем «голые иксы», но можно в отладчике посмотреть, какие именно вызовы Xt/Xlib «дёргает» Motif.

Bass ★★★★★
()

XGrabPointer() и XGrabKeyboard() вообще не дают какого-то результата

результат вызова проверяешь?

returns GrabSuccess if the grab was successful.

anonymous
()

не позволяло получать фокус другим окнам до момента своего закрытия. Можно ли такое поведение реализовать в X11?

в общем случае НЕТ. У тебя окна X с разных хостов и сессий. Х - эдакий мульти-терминал, отдельный клиент не может его захватить монопольно.

Только на уровне WM и локального приложения.

MKuznetsov ★★★★★
()
Последнее исправление: MKuznetsov (всего исправлений: 1)

Я как-то смотрел код kscreenlocker с той же целью и плюнул: там немало нетривиального кода и много моментов, которые надо учитывать. Например, чужое окно по автостарту может «вылезти» наверх само, WM может отработать клавиши клавиатуры более приоритетно и т.п.

Самый лучший вариант: форкнуть уже готовое (тот же kscreenlocker) и допиливать то, что нужно.

next_time ★★★★★
()