diff options
| author | Karel Klic <kklic@redhat.com> | 2009-11-19 10:14:27 +0100 |
|---|---|---|
| committer | Karel Klic <kklic@redhat.com> | 2009-11-19 10:14:27 +0100 |
| commit | bd60681c8227bc31ef0991e98a9a3e849032c924 (patch) | |
| tree | 5d4f3cf03d54ecb30ab863c7cc349bfcd232346c /src/Applet/CCApplet.cpp | |
| parent | 0ecc573a8ba79bca8e37809c41f92f0b629149e8 (diff) | |
| parent | 83aea71df4761ec10c0d947055e65102bcace489 (diff) | |
| download | abrt-bd60681c8227bc31ef0991e98a9a3e849032c924.tar.gz abrt-bd60681c8227bc31ef0991e98a9a3e849032c924.tar.xz abrt-bd60681c8227bc31ef0991e98a9a3e849032c924.zip | |
Merge branch 'master' of ssh://git.fedorahosted.org/git/abrt
Diffstat (limited to 'src/Applet/CCApplet.cpp')
| -rw-r--r-- | src/Applet/CCApplet.cpp | 89 |
1 files changed, 79 insertions, 10 deletions
diff --git a/src/Applet/CCApplet.cpp b/src/Applet/CCApplet.cpp index bae0cf8..e6a3cf0 100644 --- a/src/Applet/CCApplet.cpp +++ b/src/Applet/CCApplet.cpp @@ -108,9 +108,20 @@ You should have received a copy of the GNU General Public License along with thi CApplet::CApplet() { - m_pStatusIcon = gtk_status_icon_new_from_stock(GTK_STOCK_DIALOG_WARNING); m_bDaemonRunning = true; - + /* set-up icon buffers */ + m_iAnimator = 0; + m_iAnimationStage = ICON_DEFAULT; + m_bIconsLoaded = load_icons(); + /* - animation - */ + if(m_bIconsLoaded == true) + { + m_pStatusIcon = gtk_status_icon_new_from_pixbuf(icon_stages_buff[ICON_DEFAULT]); + } + else + { + m_pStatusIcon = gtk_status_icon_new_from_stock(GTK_STOCK_DIALOG_WARNING); + } notify_init("ABRT"); m_pNotification = notify_notification_new_with_status_icon("Warning", NULL, NULL, m_pStatusIcon); notify_notification_set_urgency(m_pNotification, NOTIFY_URGENCY_CRITICAL); @@ -186,7 +197,7 @@ void CApplet::CrashNotify(const char *format, ...) if (gtk_status_icon_is_embedded(m_pStatusIcon)) notify_notification_show(m_pNotification, &err); if (err != NULL) - g_print(err->message); + error_msg(err->message); } void CApplet::OnAppletActivate_CB(GtkStatusIcon *status_icon, gpointer user_data) @@ -215,7 +226,11 @@ void CApplet::OnMenuPopup_cb(GtkStatusIcon *status_icon, guint activate_time, gpointer user_data) { - if (((CApplet *)user_data)->m_pMenu != NULL) + CApplet *applet = (CApplet *)user_data; + /* stop the animation */ + applet->stop_animate_icon(); + + if (applet->m_pMenu != NULL) { gtk_menu_popup(GTK_MENU(((CApplet *)user_data)->m_pMenu), NULL, NULL, @@ -227,8 +242,9 @@ void CApplet::OnMenuPopup_cb(GtkStatusIcon *status_icon, void CApplet::ShowIcon() { gtk_status_icon_set_visible(m_pStatusIcon, true); - //Active wait for icon to be REALLY visible in status area - //while(!gtk_status_icon_is_embedded(m_pStatusIcon)) continue; + /* only animate if all icons are loaded, use the "gtk-warning" instead */ + if(m_bIconsLoaded) + animate_icon(); } void CApplet::onHide_cb(GtkMenuItem *menuitem, gpointer applet) @@ -243,10 +259,11 @@ void CApplet::onAbout_cb(GtkMenuItem *menuitem, gpointer dialog) gtk_widget_hide(GTK_WIDGET(dialog)); } -//void CApplet::HideIcon() -//{ -// gtk_status_icon_set_visible(m_pStatusIcon, false); -//} +void CApplet::HideIcon() +{ + gtk_status_icon_set_visible(m_pStatusIcon, false); + stop_animate_icon(); +} void CApplet::Disable(const char *reason) { @@ -279,6 +296,58 @@ void CApplet::Enable(const char *reason) ShowIcon(); } +gboolean CApplet::update_icon(void *user_data) +{ + CApplet* applet = (CApplet*)user_data; + if(applet->m_pStatusIcon && applet->m_iAnimationStage < ICON_STAGE_LAST){ + gtk_status_icon_set_from_pixbuf(applet->m_pStatusIcon, + applet->icon_stages_buff[applet->m_iAnimationStage++]); + } + else + error_msg("icon is null"); + if(applet->m_iAnimationStage == ICON_STAGE_LAST){ + applet->m_iAnimationStage = 0; + } + return true; +} + +void CApplet::animate_icon() +{ + if(m_iAnimator == 0) + { + m_iAnimator = g_timeout_add(100, update_icon, this); + } +} + +void CApplet::stop_animate_icon() +{ + /* animator should be 0 if icons are not loaded, so this should be safe */ + if(m_iAnimator != 0){ + g_source_remove(m_iAnimator); + gtk_status_icon_set_from_pixbuf(m_pStatusIcon, icon_stages_buff[ICON_DEFAULT]); + m_iAnimator = 0; + } +} + +bool CApplet::load_icons() +{ + int stage; + for(stage = ICON_DEFAULT; stage < ICON_STAGE_LAST; stage++) + { + char name[sizeof(ICON_DIR"/abrt%02d.png")]; + GError *error = NULL; + if(snprintf(name, sizeof(ICON_DIR"/abrt%02d.png"),ICON_DIR"/abrt%02d.png", stage) > 0){ + icon_stages_buff[stage] = gdk_pixbuf_new_from_file(name, &error); + if(error != NULL){ + error_msg("Can't load pixbuf from %s, animation is disabled!", name); + return false; + } + } + } + return true; +} + + //int CApplet::AddEvent(int pUUID, const std::string& pProgname) //{ // m_mapEvents[pUUID] = "pProgname"; |
