Russian Qt Forum

Компиляторы и платформы => Mac OS X => Тема начата: ecspertiza от Март 14, 2012, 17:10



Название: Получение фокуса приложения в маке[РЕШЕНО]
Отправлено: ecspertiza от Март 14, 2012, 17:10
Есть приложение, работает в трее по хоткею открывает окно на фуллскринн, но что самое интересное фокус остается на предыдущем приложении, у окна которое на фулскрин открывается пробовал и Qt::WindowStaysOnTopHint ставить, все равно, фокус на предыдущем, может есть какие то нюансы ?


Название: Re: Получение фокуса приложения в маке
Отправлено: Bepec от Март 15, 2012, 07:05
На предыдущем - в смысле левом окне?


Название: Re: Получение фокуса приложения в маке
Отправлено: ecspertiza от Март 15, 2012, 09:19
Если имеется ввиду где остается фокус, то на предыдущем приложении, то есть если работаем в браузере и открываем приложение, фокус остается на браузере, если работаем в фидлере и запускаем приложение ,то фокус так и остается в фидлере.


Название: Re: Получение фокуса приложения в маке
Отправлено: Bepec от Март 15, 2012, 09:21
Где то была темка про фокус в MACе.


Название: Re: Получение фокуса приложения в маке
Отправлено: ecspertiza от Апрель 18, 2012, 11:58
Ну что никто не сталкивался ? А то совсем кисло с этим багом. Всякие setActiveWindow() тоже не помогают.


Название: Re: Получение фокуса приложения в маке
Отправлено: kambala от Апрель 18, 2012, 13:28
попробуй устанавливать фокус через какой-нить родной метод NSView


Название: Re: Получение фокуса приложения в маке
Отправлено: Igors от Апрель 18, 2012, 13:47
Попробуйте по-старинке

Код
C++ (Qt)
ProcessSerialNumber psn;
OSErr err;
 
err = ::GetCurrentProcess(&psn);
if (err == noErr)
::SetFrontProcess(&psn);
 


Название: Re: Получение фокуса приложения в маке
Отправлено: ecspertiza от Апрель 18, 2012, 15:19
Код:
ProcessSerialNumber	psn;
OSErr err;
 
err = ::GetCurrentProcess(&psn);
if (err == noErr)
::SetFrontProcess(&psn);

не работает, скорее всего потому что сборка Qt Cocoa , а NSView еще не пробовал, насколько понял нужно будет мост писать ?


Название: Re: Получение фокуса приложения в маке
Отправлено: Igors от Апрель 18, 2012, 16:01
Код:
ProcessSerialNumber	psn;
OSErr err;
 
err = ::GetCurrentProcess(&psn);
if (err == noErr)
::SetFrontProcess(&psn);

не работает, скорее всего потому что сборка Qt Cocoa , а NSView еще не пробовал, насколько понял нужно будет мост писать ?
SetFrontProcess тоже возвращает код ошибки - есть смысл его посмотреть. Также через ::GetFrontProcess можно получить текущий фокус и сравнить со своим процессом (используя ::SameProcess).

Др. словами есть смысл потратить 10-15 мин чтобы "осмотреться" и понять где проблема - перед тем как городить огород


Название: Re: Получение фокуса приложения в маке
Отправлено: ecspertiza от Апрель 18, 2012, 16:08
Др. словами есть смысл потратить 10-15 мин чтобы "осмотреться" и понять где проблема - перед тем как городить огород

Тоже верно, ошибка возвращается вот тут

Код:
err = ::GetCurrentProcess(&psn);

так как в мак апи не силен, то пошел гуглить, и нашел что , что бы получить описание ошибки нужно OSErr преобразовать к NSError и там получать описание, но это опять же огород получиться. Я про то что для NSError тоже нужно будет прослойку писать :)


Название: Re: Получение фокуса приложения в маке
Отправлено: ecspertiza от Апрель 18, 2012, 16:17
Код:
ProcessSerialNumber	psn;
OSErr err;
 
err = ::GetCurrentProcess(&psn);
if (err == noErr)
::SetFrontProcess(&psn);

Заработало :) Igors, спасибо что остановил меня :) Я немного осмотрелся и нашел где косяк был. И за подсказку с кодом тоже спасибо :)


Название: Re: Получение фокуса приложения в маке
Отправлено: Igors от Апрель 18, 2012, 16:23
так как в мак апи не силен, то пошел гуглить, и нашел что , что бы получить описание ошибки нужно OSErr преобразовать к NSError и там получать описание, но это опять же огород получиться. Я про то что для NSError тоже нужно будет прослойку писать :)
http://docs.activestate.com/activeperl/5.14/lib/Mac/Errors.html (http://docs.activestate.com/activeperl/5.14/lib/Mac/Errors.html) А еше проще открыть хедер MacErrors.h
Также стоит глянуть Processes.h, там перед каждой ф-цией короткое описание, обычно его хватает. Ну и Xcode показывает текст OSErr в окне переменных