Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: ecspertiza от Сентябрь 25, 2012, 13:31



Название: Фокус приложения Ubuntu(unity)
Отправлено: ecspertiza от Сентябрь 25, 2012, 13:31
Всем привет. Нашел у себя в приложении багу неприятную. Приложение вызывается по горячим клавишам, стало быть открывается окно, на нем можем что то делать, так же по Esc пользователь может закрыть это окно. Но на ubuntu возник такой косяк, что окно то появилось но фокус приложению от ОС не перешел, стало быть и кнопка Esc не работает до тех пор пока пользователь не кликнет на этом окне. Собственно вопрос, как профиксить ? QWidget::rase() не помогает. У окна задан флаг WindowStaysOnTopHint тоесть оно и так сверху всего.


Название: Re: Фокус приложения Ubuntu(unity)
Отправлено: GreatSnake от Сентябрь 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();
}
 


Название: Re: Фокус приложения Ubuntu(unity)
Отправлено: ecspertiza от Сентябрь 25, 2012, 14:27
Спасибо, так работает. А с чем связана данная бага ? с косяками unity ?


Название: Re: Фокус приложения Ubuntu(unity)
Отправлено: GreatSnake от Сентябрь 25, 2012, 14:31
А с чем связана данная бага ? с косяками unity ?
Это не бага и не косяк, это WindowManager focus-policy.
И нужно использовать выше указанную функцию, чтобы поведение всегда было одинаковым независимо от этих политик.