summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiri Moskovcak <jmoskovc@redhat.com>2009-07-28 15:22:48 +0200
committerJiri Moskovcak <jmoskovc@redhat.com>2009-07-28 15:22:48 +0200
commit88a9c7fdaee695f15a9aeaaef177c0318896dc6a (patch)
treed9866cf66a16b37305349e520fe47698f74deef8
parent4e7ebc3c2bc770f0aac4f857954755fe8a3d074a (diff)
downloadabrt-88a9c7fdaee695f15a9aeaaef177c0318896dc6a.tar.gz
abrt-88a9c7fdaee695f15a9aeaaef177c0318896dc6a.tar.xz
abrt-88a9c7fdaee695f15a9aeaaef177c0318896dc6a.zip
Applet: Added detection whether daemon is running
-rw-r--r--src/Applet/Applet.cpp10
-rw-r--r--src/Applet/CCApplet.cpp64
-rw-r--r--src/Applet/CCApplet.h6
3 files changed, 70 insertions, 10 deletions
diff --git a/src/Applet/Applet.cpp b/src/Applet/Applet.cpp
index b3ea05b9..3ae9b4a8 100644
--- a/src/Applet/Applet.cpp
+++ b/src/Applet/Applet.cpp
@@ -61,12 +61,16 @@ int main(int argc, char **argv)
session.request_name("com.redhat.abrt.applet");
}
- DBus::Connection conn = DBus::Connection::SystemBus();
- //CDBusClient client(conn, CC_DBUS_PATH, CC_DBUS_NAME);
+ DBus::Connection conn = DBus::Connection::SystemBus();
applet = new CApplet(conn, CC_DBUS_PATH, CC_DBUS_NAME);
applet->ConnectCrashHandler(crash_notify_cb);
- gtk_main();
+ if(!conn.has_name(CC_DBUS_NAME))
+ {
+ std::cout << "Daemon is not running" << std::endl;
+ applet->Disable("Daemon is not running");
+ }
gtk_main();
gdk_threads_leave();
+ delete applet;
return 0;
}
diff --git a/src/Applet/CCApplet.cpp b/src/Applet/CCApplet.cpp
index 19887488..eede5d15 100644
--- a/src/Applet/CCApplet.cpp
+++ b/src/Applet/CCApplet.cpp
@@ -23,14 +23,20 @@
#include <sstream>
#include <cstdio>
+static const char *DBUS_SERVICE_NAME = "org.freedesktop.DBus";
+static const char *DBUS_SERVICE_PATH = "/org/freedesktop/DBus";
+
CApplet::CApplet(DBus::Connection &connection, const char *path, const char *name)
: DBus::ObjectProxy(connection, path, name)
{
+ m_pDaemonWatcher = new DaemonWatcher(connection, DBUS_SERVICE_PATH, DBUS_SERVICE_NAME);
+ m_pDaemonWatcher->ConnectStateChangeHandler(DaemonStateChange_cb,this);
m_pStatusIcon = gtk_status_icon_new_from_stock(GTK_STOCK_DIALOG_WARNING);
+ m_bDaemonRunning = true;
char notify_title[5] = "ABRT";
notify_init(notify_title);
m_pNotification = notify_notification_new_with_status_icon("Warning!",NULL, NULL,m_pStatusIcon);
- notify_notification_set_urgency (m_pNotification,NOTIFY_URGENCY_CRITICAL);
+ notify_notification_set_urgency(m_pNotification,NOTIFY_URGENCY_CRITICAL);
notify_notification_set_timeout(m_pNotification, 5000);
gtk_status_icon_set_visible(m_pStatusIcon,FALSE);
// LMB click
@@ -42,6 +48,7 @@ CApplet::CApplet(DBus::Connection &connection, const char *path, const char *nam
CApplet::~CApplet()
{
+ delete m_pDaemonWatcher;
}
/* dbus related */
void CApplet::Crash(std::string &value)
@@ -57,6 +64,19 @@ void CApplet::Crash(std::string &value)
}
}
+void CApplet::DaemonStateChange_cb(bool running, void* data)
+{
+ CApplet *applet = (CApplet *)data;
+ if(!running)
+ {
+ applet->Disable("ABRT service is not running!");
+ }
+ else
+ {
+ applet->Enable("ABRT service has been started!");
+ }
+}
+
void CApplet::ConnectCrashHandler(void (*pCrashHandler)(const char *progname))
{
m_pCrashHandler = pCrashHandler;
@@ -83,12 +103,12 @@ void CApplet::SetIconTooltip(const char *format, ...)
va_end (args);
if (n != -1)
{
- notify_notification_update (m_pNotification, "Warning!",buf, NULL);
- gtk_status_icon_set_tooltip(m_pStatusIcon,buf);
+ notify_notification_update(m_pNotification, "Warning!",buf, NULL);
+ gtk_status_icon_set_tooltip_text(m_pStatusIcon,buf);
}
else
{
- gtk_status_icon_set_tooltip(m_pStatusIcon,"Error while setting the tooltip!");
+ gtk_status_icon_set_tooltip_text(m_pStatusIcon,"Error while setting the tooltip!");
}
delete[] buf;
@@ -99,8 +119,11 @@ void CApplet::OnAppletActivate_CB(GtkStatusIcon *status_icon,gpointer user_data)
CApplet *applet = (CApplet *)user_data;
FILE *gui = NULL;
//FIXME - use fork+exec and absolute paths? or dbus?
- gui = popen((std::string(BIN_DIR) + "/abrt-gui").c_str(),"r");
- gtk_status_icon_set_visible(applet->m_pStatusIcon,false);
+ if(applet->m_bDaemonRunning)
+ {
+ gui = popen((std::string(BIN_DIR) + "/abrt-gui").c_str(),"r");
+ gtk_status_icon_set_visible(applet->m_pStatusIcon,false);
+ }
}
void CApplet::OnMenuPopup_cb(GtkStatusIcon *status_icon,
@@ -108,7 +131,7 @@ void CApplet::OnMenuPopup_cb(GtkStatusIcon *status_icon,
guint activate_time,
gpointer user_data)
{
- //gtk_status_icon_set_blinking(((CApplet *)user_data)->m_pStatusIcon, false);
+ gtk_status_icon_set_visible(((CApplet *)user_data)->m_pStatusIcon, false);
}
void CApplet::ShowIcon()
@@ -121,6 +144,33 @@ void CApplet::HideIcon()
{
gtk_status_icon_set_visible(m_pStatusIcon,false);
}
+void CApplet::Disable(const char *reason)
+{
+ /*
+ FIXME: once we have our icon
+ */
+ m_bDaemonRunning = false;
+ GdkPixbuf *gray_scaled;
+ GdkPixbuf *pixbuf = gtk_icon_theme_load_icon(gtk_icon_theme_get_default(), GTK_STOCK_DIALOG_WARNING, 24, GTK_ICON_LOOKUP_USE_BUILTIN, NULL);
+ gray_scaled = gdk_pixbuf_copy(pixbuf);
+ if(pixbuf){
+ gdk_pixbuf_saturate_and_pixelate(pixbuf, gray_scaled, 0.0, NULL);
+ gtk_status_icon_set_from_pixbuf(m_pStatusIcon, gray_scaled);
+ }
+ else
+ std::cerr << "Cannot load icon!" << std::endl;
+ SetIconTooltip(reason);
+ ShowIcon();
+}
+
+void CApplet::Enable(const char *reason)
+{
+ /* restore the original icon*/
+ m_bDaemonRunning = true;
+ SetIconTooltip(reason);
+ gtk_status_icon_set_from_stock(m_pStatusIcon,GTK_STOCK_DIALOG_WARNING);
+ ShowIcon();
+}
int CApplet::AddEvent(int pUUID, const std::string& pProgname)
{
diff --git a/src/Applet/CCApplet.h b/src/Applet/CCApplet.h
index 86a146d6..914ddc5e 100644
--- a/src/Applet/CCApplet.h
+++ b/src/Applet/CCApplet.h
@@ -39,6 +39,8 @@ class CApplet
GtkStatusIcon* m_pStatusIcon;
NotifyNotification *m_pNotification;
std::map<int, std::string > m_mapEvents;
+ DaemonWatcher *m_pDaemonWatcher;
+ bool m_bDaemonRunning;
public:
CApplet(DBus::Connection &connection, const char *path, const char *name);
~CApplet();
@@ -47,6 +49,8 @@ class CApplet
//void DisableIcon();
void BlinkIcon(bool pBlink);
void SetIconTooltip(const char *format, ...);
+ void Disable(const char *reason);
+ void Enable(const char *reason);
// create some event storage, to let user choose
// or ask the daemon every time?
// maybe just events which occured during current session
@@ -54,6 +58,8 @@ class CApplet
int AddEvent(int pUUID, const std::string& pProgname);
int RemoveEvent(int pUUID);
void ConnectCrashHandler(void (*pCrashHandler)(const char *progname));
+ static void DaemonStateChange_cb(bool running, void* data);
+
protected:
//@@TODO applet menus
static void OnAppletActivate_CB(GtkStatusIcon *status_icon,gpointer user_data);