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

в 15:59, , рубрики: linux, qt, qt creator, Qt Software, метки: , ,

Помогаем KeePassX работать с Indicator Applet Complete в последних версиях Ubuntu После новости про украденную базу паролей на 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, может, кому-то это пригодится.

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

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

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

Устанавливаем нужные библиотеки, и QT Creator заодно

$ sudo apt-get install build-essential qt4-qmake libxtst-dev qtcreator

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

$ qmake && make

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

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

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

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

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

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

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

Для начала добавим новое событие. Открываем форму MainWindow.ui, далее во вкладке Action Editor добавляем новое событие
Помогаем KeePassX работать с Indicator Applet Complete в последних версиях Ubuntu

Сохраняем, и тут первый сюрприз, который отнял у меня пару часов: 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()));

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

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

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

sudo checkinstall

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

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

Исходники доступны тут: github.com/relgames/keepassx

Автор: relgames


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js