Search
Write a publication
Pull to refresh

Как поймать клик на иконке в MacX dock из Qt приложения

Иногда средств Qt не хватает, что бы корректно обрабатывать нативные события в разных ОС. В этой статье я хочу рассказать, об одном из таких специфических событий, а именно клик, на иконке в маковском dockе.


Адаптируя MDC для Mac OS X столкнулся со следующей проблемой. По уже сложившимся представлениям о прекрасном, закрытие всех окон приложения IM не должно приводить к закрытию самого приложения. Пользователю, для того что бы снова увидеть окно контакт листа, как правило, нужно просто кликнуть на иконку в tray. Однако, с маком все обстоит несколько хитрее, поскольку для пользователя более естественным является работа dockом. Таким образом, закрыв все окна приложения пользователь ожидает, что кликнув на иконку в dockе, он снова будет лицезреть главное окно приложения. Однако этого не происходит.

Напрашивается простой вывод, необходимо отлавливать события клика на иконку в docke и показывать главное окно приложения. Однако чтение документации подобного eventa не обнаружило. Вопрос в support nokia тоже не порадовал, оказалось что подобного eventa нет поскольку он противоречит концепции Qt, относительно платформозависимых событий.

Среди стандартных Qt event ов есть `QEvent::ApplicationActivate`, однако он удовлетворяет наши запросам лишь отчасти. Потому как, если закрыть все окна нашего приложения, а потом сразу кликнуть на иконку в dock, приложение все еще будет являться активным, и событие не случится. А eventа ApplicationReActive в Qt нет.

Выход был найден следующий, использовать Carbon для отлова нативных маковских событий

#ifndef MACAPPLICATION_H
#define MACAPPLICATION_H

// Qt4 Headers
#include <QApplication>

// Carbon Headers
#ifdef Q_WS_MAC
  
#include <Carbon/Carbon.h>
#endif

class CMacApplication : public QApplication
{
  Q_OBJECT
public:
  CMacApplication (int& m_argc, char **m_argv);

  /**
   * Метнуть сигнал о переоткрытии приложения (в том числе dock click)
   */
   void emitReopenApplication ();

#ifdef Q_WS_MAC
  AEEventHandlerUPP m_appleEventProcessorUPP;
#endif

signals:

  void reopenApplication();

};
#endif // MACAPPLICATION_H



Страничка этого маленького проекта тут, там же ссылка на наш репозиторий
_________
Текст подготовлен в ХабраРедакторе
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.