Pull to refresh

Помогаем KeePassX работать с Indicator Applet Complete в последних версиях Ubuntu

Reading time 3 min
Views 3.5K
После новости про украденную базу паролей на LinkedIn, задумался о безопасности своих паролей.

Стал искать менеджер паролей под Ubuntu 12.04, остановился на KeePassX. Он меня полностью устроил, если бы не одна мелочь: в Ubuntu 12.04 я пользуюсь Gnome Classic, и Indicator Applet Complete для часов/systray. А этот апплет рисует меню по нажатию на иконку программы левой клавишей мышки, а при нажатии на правую — рисует свои меню. И если свернуть KeePassX в трэй, то восстановить его оттуда нельзя никак.

Пытался решить проблему несколькими путями: попробовал написать на форуме, нашел такой же баг, висящий аж с 2011 года, но, похоже, автор все силы бросил на KeePassX 2, и первую версию забросил.

Ну что же, тварь я дрожащая, или право имею программист? Я решил исправить проблему самостоятельно, а именно, путем добавления нового пункта в Systray меню, то есть чтобы можно было показать главное окно из меню systray.

Предупреждаю сразу, многим статья не будет интересна, это мой первый опыт с Qt, да и на C/C++ последний раз писал году в 1999, и помню лишь базовые вещи. Статью решил написать, т.к. это мой первый успешный опыт изменения OpenSource программ на Qt, может, кому-то это пригодится.

UPD Оказалось, я изобрел велосипед. Всему виной пакет sni-qt, который переделывает QSystemTrayIcon в StatusNotifierItems. После удаления пакета иконка встала в другой трэй, где клик работает как надо. Спасибо inkvizitor68sl за комментарий.

Если все еще интересно, добро пожаловать под кат.


Настройка проекта


Качаем исходные коды тут, распаковываем. Дальше работать будем в папке исходников.

Устанавливаем нужные библиотеки, и Qt Creator заодно
$ sudo apt-get install build-essential qt4-qmake libxtst-dev qtcreator

Убедимся, что все библиотеки на месте:
$ qmake && make

Если все в порядке, то проект скомпилируется и можно будет запустить программу из каталога bin.

Запускаем Qt Creator (у меня он находится в Applications/Programming), открываем проект keepassx.pro



Можно так же разрешить дебаг, в KeePassX он включается через явное задание переменной в src.pro:


Проверяем, что проект настроен верно: Build -> Build All, затем кнопка Run.

Добавляем пункт меню


Qt использует event-модель, когда компоненты публикуют некие события (называемые Action), и на эти события можно подписаться.

Для начала добавим новое событие. Открываем форму MainWindow.ui, далее во вкладке Action Editor добавляем новое событие


Сохраняем, и тут первый сюрприз, который отнял у меня пару часов: Qt Creator добавляет отсебятину в код формы. Так что нужно два раза кликнуть на элемент таблицы (в котором отображается список паролей для текущей группы, на форме он справа вверху) и убрать колонку «1».

Далее нужно добавить этот Action в меню. Открываем mainwindow.cpp, идем в самый конец метода setupMenus и меняем код следующим образом:
SysTrayMenu = new QMenu(APP_DISPLAY_NAME,this);
SysTrayMenu->addAction(ShowHideAction);  // тут добавляем новый пункт меню, при нажатии на который будет происходить событие ShowHideAction
SysTrayMenu->addAction(FileUnLockWorkspaceAction);
SysTrayMenu->addSeparator();
SysTrayMenu->addAction(FileExitAction);
SysTray->setContextMenu(SysTrayMenu);

Теперь настало время написать метод, который будет вызываться при нажатии на наш элемент меню.
Без лишних заморочек, пишем в конце mainwindow.cpp
void KeepassMainWindow::OnShowHide(){
    OnSysTrayActivated(QSystemTrayIcon::Trigger); 
}

То есть просто вызываем уже существующий метод, который должен бы срабатывать при клике на иконку в трее, но не срабатывает.

Не забудем и про заголовки: меняем mainwindow.h, в private slots добавляем строку
void OnShowHide();

И последнее, теперь нужно связать событие ShowHideAction с методом OnShowHide. В конец метода setupConnections() добавляем
connect(ShowHideAction,SIGNAL(triggered()), this, SLOT(OnShowHide()));


Сохраняем все и пробуем запустить. Если все сделано правильно, то должен появится новый пункт в меню


Установка и сборка пакета


Теперь настало время установить новую версию в систему. Идем в терминал, на всякий случай перекомпилируем все тем же путем, как делали это в начале статьи, и затем выполняем
sudo checkinstall

Checkinstall спросит у вас пару вопросов, можно оставить все по-умолчанию, но рекомендую поменять версию на что-то типа 0.4.3-1, чтобы предотвратить откат к старой версии при обновлении пакетов.

Все, когда команда отработает, вы получите установленный KeePassX и заодно .deb пакет, который можно установить на другую машину.

Исходники доступны тут: github.com/relgames/keepassx
Tags:
Hubs:
+14
Comments 11
Comments Comments 11

Articles