Russian Qt Forum
Ноябрь 24, 2024, 07:05 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Фокус приложения Ubuntu(unity)  (Прочитано 2607 раз)
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« : Сентябрь 25, 2012, 13:31 »

Всем привет. Нашел у себя в приложении багу неприятную. Приложение вызывается по горячим клавишам, стало быть открывается окно, на нем можем что то делать, так же по Esc пользователь может закрыть это окно. Но на ubuntu возник такой косяк, что окно то появилось но фокус приложению от ОС не перешел, стало быть и кнопка Esc не работает до тех пор пока пользователь не кликнет на этом окне. Собственно вопрос, как профиксить ? QWidget::rase() не помогает. У окна задан флаг WindowStaysOnTopHint тоесть оно и так сверху всего.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Сентябрь 25, 2012, 13:35 »

Используй для этого такую функцию:
Код
C++ (Qt)
//
#ifdef Q_WS_X11
#include <QX11Info>
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#endif
 
void QUActivateWindow( QWidget* w )
{
if( !w->isVisible() )
w->show();
 
if( w->window() != w )
{
if( QWidget* fw = w->focusWidget() )
fw->setFocus();
return;
}
 
w->raise();
 
#ifdef Q_WS_X11
 
Display* dpy = QX11Info::display();
 
XClientMessageEvent ev;
bzero( &ev, sizeof( XClientMessageEvent ) );
 
ev.type = ClientMessage;
ev.window = w->winId();
ev.message_type = XInternAtom( dpy, "_NET_ACTIVE_WINDOW", False );
ev.format = 32;
ev.send_event = True;
ev.data.l[1] = QX11Info::appUserTime();
 
XSendEvent( dpy,
RootWindowOfScreen( DefaultScreenOfDisplay( dpy) ), False,
SubstructureRedirectMask | SubstructureNotifyMask, (XEvent*) &ev );
XSync( dpy, False );
 
#elif defined(Q_OS_WIN)
 
SetWindowPos ( w->winId(), HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );
 
#endif
 
w->activateWindow();
}
 
Записан

Qt 5.11/4.8.7 (X11/Win)
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #2 : Сентябрь 25, 2012, 14:27 »

Спасибо, так работает. А с чем связана данная бага ? с косяками unity ?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Сентябрь 25, 2012, 14:31 »

А с чем связана данная бага ? с косяками unity ?
Это не бага и не косяк, это WindowManager focus-policy.
И нужно использовать выше указанную функцию, чтобы поведение всегда было одинаковым независимо от этих политик.
Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.082 секунд. Запросов: 23.