From e865e692994c2cc3d87d346c9ee354e6f82925ea Mon Sep 17 00:00:00 2001 From: Jean-Philippe Orsini Date: Sun, 26 Jun 2011 09:57:29 +0000 Subject: [PATCH] if appindicator not supported by wm: - quit psensor on window close - show psensor even if hide on startup is enabled --- src/ui.c | 9 +++++++-- src/ui_appindicator.c | 28 ++++++++++++++++++++++++++++ src/ui_appindicator.h | 1 + 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/ui.c b/src/ui.c index d795d15..5a00a93 100644 --- a/src/ui.c +++ b/src/ui.c @@ -23,15 +23,20 @@ #include "ui_pref.h" #include "ui_sensorpref.h" #include "ui_sensorlist.h" +#include "ui_appindicator.h" static gboolean on_delete_event_cb(GtkWidget *widget, GdkEvent *event, gpointer data) { + struct ui_psensor *ui = data; #if defined(HAVE_APPINDICATOR) || defined(HAVE_APPINDICATOR_029) - gtk_widget_hide(((struct ui_psensor *)data)->main_window); + if (is_appindicator_supported()) + gtk_widget_hide(ui->main_window); + else + ui_psensor_quit(ui); #else - ui_psensor_quit(); + ui_psensor_quit(ui); #endif return TRUE; diff --git a/src/ui_appindicator.c b/src/ui_appindicator.c index beb0e9d..d2c864e 100644 --- a/src/ui_appindicator.c +++ b/src/ui_appindicator.c @@ -31,6 +31,8 @@ #include "ui_pref.h" static GtkMenuItem **sensor_menu_items; +static GtkWidget *main_window; +static int appindicator_supported = 1; static void cb_menu_show(GtkMenuItem *mi, gpointer data) { @@ -228,15 +230,36 @@ void ui_appindicator_update(struct ui_psensor *ui) update_sensor_menu_items(ui->sensors); } +static GtkStatusIcon* unity_fallback(AppIndicator *indicator) +{ + gtk_widget_show_all(main_window); + + appindicator_supported = 0; + + return NULL; +} + +static void unity_unfallback(AppIndicator *indicator, + GtkStatusIcon *status_icon) +{ + appindicator_supported = 1; +} + + void ui_appindicator_init(struct ui_psensor *ui) { GtkWidget *indicatormenu; + main_window = ui->main_window; + ui->indicator = app_indicator_new("psensor", "psensor", APP_INDICATOR_CATEGORY_APPLICATION_STATUS); + APP_INDICATOR_GET_CLASS(ui->indicator)->fallback = unity_fallback; + APP_INDICATOR_GET_CLASS(ui->indicator)->unfallback = unity_unfallback; + app_indicator_set_status(ui->indicator, APP_INDICATOR_STATUS_ACTIVE); app_indicator_set_attention_icon(ui->indicator, "psensor_hot"); @@ -246,3 +269,8 @@ void ui_appindicator_init(struct ui_psensor *ui) app_indicator_set_menu(ui->indicator, GTK_MENU(indicatormenu)); } + +int is_appindicator_supported() +{ + return appindicator_supported; +} diff --git a/src/ui_appindicator.h b/src/ui_appindicator.h index 72934e8..d1912b4 100644 --- a/src/ui_appindicator.h +++ b/src/ui_appindicator.h @@ -24,5 +24,6 @@ void ui_appindicator_init(struct ui_psensor *ui); void ui_appindicator_update(struct ui_psensor *ui); +int is_appindicator_supported(); #endif -- 2.7.4