7 #include <QSharedMemory>
19 #ifdef USE_LIBAPPINDICATOR
21 void quitIndicator(GtkMenu* menu, gpointer data) {
27 void restoreIndicator(GtkMenu* menu, gpointer data) {
33 #endif // USE_LIBAPPINDICATOR
52 #ifdef USE_LIBAPPINDICATOR
53 QString desktop = std::getenv(
"XDG_CURRENT_DESKTOP");
54 unityDesktop = (desktop.toLower() ==
"unity");
59 indicatorMenu = gtk_menu_new();
60 indicatorMenuRestoreItem = gtk_menu_item_new_with_label(
"Restore");
61 indicatorMenuQuitItem = gtk_menu_item_new_with_label(
"Quit ckb");
63 gtk_menu_shell_append(GTK_MENU_SHELL(indicatorMenu), indicatorMenuRestoreItem);
64 gtk_menu_shell_append(GTK_MENU_SHELL(indicatorMenu), indicatorMenuQuitItem);
66 g_signal_connect(indicatorMenuQuitItem,
"activate",
67 G_CALLBACK(quitIndicator),
this);
68 g_signal_connect(indicatorMenuRestoreItem,
"activate",
69 G_CALLBACK(restoreIndicator),
this);
71 gtk_widget_show(indicatorMenuRestoreItem);
72 gtk_widget_show(indicatorMenuQuitItem);
74 indicator = app_indicator_new(
"ckb",
"indicator-messages", APP_INDICATOR_CATEGORY_APPLICATION_STATUS);
76 app_indicator_set_status(indicator, APP_INDICATOR_STATUS_ACTIVE);
77 app_indicator_set_menu(indicator, GTK_MENU(indicatorMenu));
78 app_indicator_set_icon(indicator,
"ckb");
80 #endif // USE_LIBAPPINDICATOR
85 trayIcon =
new QSystemTrayIcon(QIcon(
":/img/ckb-logo.png"),
this);
87 connect(
trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
this, SLOT(
iconClicked(QSystemTrayIcon::ActivationReason)));
93 QMenuBar* menuBar =
new QMenuBar(
this);
95 this->menuBar()->addMenu(
"ckb")->addAction(
closeAction);
98 new QShortcut(QKeySequence(
"Ctrl+Q"),
this, SLOT(
quitApp()));
104 connect(qApp, SIGNAL(applicationStateChanged(Qt::ApplicationState)),
this, SLOT(
stateChange(Qt::ApplicationState)));
106 connect(qApp, SIGNAL(aboutToQuit()),
this, SLOT(
cleanup()));
113 #ifdef USE_LIBAPPINDICATOR
115 app_indicator_set_status(indicator, visible ? APP_INDICATOR_STATUS_ACTIVE : APP_INDICATOR_STATUS_PASSIVE);
117 #endif // USE_LIBAPPINDICATOR
161 QString daemonWarning;
162 if(daemonVersion != CKB_VERSION_STR)
185 metaObject()->invokeMethod(
this,
"showFwUpdateNotification", Qt::QueuedConnection, Q_ARG(
QWidget*, w), Q_ARG(
float, version));
193 static bool isShowing =
false;
200 if(QMessageBox::information(
this,
"Firmware update", tr(
"A new firmware is available for your %1 (v%2)\nWould you like to install it now?").arg(w->
device->
usbModel, QString::number(version,
'f', 2)), QMessageBox::StandardButtons(QMessageBox::Yes | QMessageBox::No), QMessageBox::Yes) == QMessageBox::Yes){
211 if(!event->spontaneous() || isHidden()){
216 QMessageBox::information(
this,
"ckb",
"ckb will still run in the background.\nTo close it, choose Exit from the tray menu\nor click \"Quit ckb\" on the Settings screen.");
227 QStringList commands = QString((
const char*)data).split(
"\n");
229 snprintf((
char*)
appShare.data(),
appShare.size(),
"PID %ld", (long)getpid());
232 foreach(
const QString& line, commands){
236 if(line.startsWith(
"Option ")){
238 QString option = line.split(
" ")[1];
242 else if(option ==
"Close")
261 if(reason == QSystemTrayIcon::DoubleClick || reason == QSystemTrayIcon::Trigger){
280 static quint64 lastStateChange = 0;
281 quint64 now = QDateTime::currentMSecsSinceEpoch();
282 if(state == Qt::ApplicationActive){
284 if(lastStateChange != 0 && now >= lastStateChange + 2 * 1000)
286 lastStateChange = now;
void stateChange(Qt::ApplicationState state)
static KbManager * kbManager()
void showFwUpdateNotification(QWidget *widget, float version)
static void set(const QString &key, const QVariant &value)
void closeEvent(QCloseEvent *event)
static QVariant get(const QString &key, const QVariant &defaultValue=QVariant())
void toggleTrayIcon(bool visible)
void removeDevice(Kb *device)
static QTimer * scanTimer()
static float ckbDaemonVersionF()
static const QString configLabel
MainWindow(QWidget *parent=0)
static float ckbGuiVersionF()
static void init(QString guiVersion)
QSystemTrayIcon * trayIcon
static MainWindow * mainWindow
static bool checkUpdates()
#define DAEMON_UNAVAILABLE_STR
void setupUi(QMainWindow *MainWindow)
void iconClicked(QSystemTrayIcon::ActivationReason reason)
SettingsWidget * settingsWidget
static QString ckbDaemonVersion()
QList< KbWidget * > kbWidgets
void addDevice(Kb *device)
static float versionForBoard(const QString &features, bool waitForComplete=false)