]> git.saurik.com Git - wxWidgets.git/blob - src/gtk/notifmsg.cpp
Use (newly) added wxStaticCastVariantData() to fix wxNO_RTTI build.
[wxWidgets.git] / src / gtk / notifmsg.cpp
1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: src/gtk/notifmsg.cpp
3 // Purpose: wxNotificationMessage for wxGTK using libnotify.
4 // Author: Vadim Zeitlin
5 // Created: 2012-07-25
6 // RCS-ID: $Id$
7 // Copyright: (c) 2012 Vadim Zeitlin <vadim@wxwidgets.org>
8 // Licence: wxWindows licence
9 ///////////////////////////////////////////////////////////////////////////////
10
11 // ============================================================================
12 // declarations
13 // ============================================================================
14
15 // ----------------------------------------------------------------------------
16 // headers
17 // ----------------------------------------------------------------------------
18
19 // for compilers that support precompilation, includes "wx.h".
20 #include "wx/wxprec.h"
21
22 #ifdef __BORLANDC__
23 #pragma hdrstop
24 #endif
25
26 #if wxUSE_NOTIFICATION_MESSAGE && wxUSE_LIBNOTIFY
27
28 #ifndef WX_PRECOMP
29 #endif // WX_PRECOMP
30
31 #include "wx/notifmsg.h"
32
33 #include <libnotify/notify.h>
34
35 #include "wx/module.h"
36
37 // General note about error handling: as notifications are meant to be
38 // non-intrusive, we use wxLogDebug() and not wxLogError() if anything goes
39 // wrong here to avoid spamming the user with message boxes. As all methods
40 // return boolean indicating success or failure, the caller could show the
41 // notification in some other way or notify about the error itself if needed.
42 #include "wx/gtk/private/error.h"
43
44 // ----------------------------------------------------------------------------
45 // A module for cleaning up libnotify on exit.
46 // ----------------------------------------------------------------------------
47
48 class wxLibnotifyModule : public wxModule
49 {
50 public:
51 virtual bool OnInit()
52 {
53 // We're initialized on demand.
54 return true;
55 }
56
57 virtual void OnExit()
58 {
59 if ( notify_is_initted() )
60 notify_uninit();
61 }
62
63 // Do initialize the library.
64 static bool Initialize()
65 {
66 if ( !notify_is_initted() )
67 {
68 if ( !notify_init(wxTheApp->GetAppName().utf8_str()) )
69 return false;
70 }
71
72 return true;
73 }
74
75 private:
76 wxDECLARE_DYNAMIC_CLASS(wxLibnotifyModule);
77 };
78
79 wxIMPLEMENT_DYNAMIC_CLASS(wxLibnotifyModule, wxModule);
80
81 // ============================================================================
82 // wxNotificationMessage implementation
83 // ============================================================================
84
85 bool wxNotificationMessage::GTKSetIconName(const wxString& name)
86 {
87 m_iconName = name;
88
89 return true;
90 }
91
92 bool wxNotificationMessage::Show(int timeout)
93 {
94 if ( !wxLibnotifyModule::Initialize() )
95 return false;
96
97 // Determine the GTK+ icon to use from flags and also set the urgency
98 // appropriately.
99 const char* icon;
100 NotifyUrgency urgency;
101 switch ( GetFlags() )
102 {
103 case wxICON_INFORMATION:
104 icon = "dialog-information";
105 urgency = NOTIFY_URGENCY_LOW;
106 break;
107
108 case wxICON_WARNING:
109 icon = "dialog-warning";
110 urgency = NOTIFY_URGENCY_NORMAL;
111 break;
112
113 case wxICON_ERROR:
114 icon = "dialog-error";
115 urgency = NOTIFY_URGENCY_CRITICAL;
116 break;
117
118 default:
119 wxFAIL_MSG( "Unknown notification message flags." );
120 return false;
121 }
122
123 // Explicitly specified icon name overrides the implicit one determined by
124 // the flags.
125 wxScopedCharBuffer buf;
126 if ( !m_iconName.empty() )
127 {
128 buf = m_iconName.utf8_str();
129 icon = buf;
130 }
131
132 // Create the notification or update an existing one if we had already been
133 // shown before.
134 if ( !m_notification )
135 {
136 m_notification = notify_notification_new
137 (
138 GetTitle().utf8_str(),
139 GetMessage().utf8_str(),
140 icon
141 );
142 if ( !m_notification )
143 {
144 wxLogDebug("Failed to creation notification.");
145
146 return false;
147 }
148 }
149 else
150 {
151 if ( !notify_notification_update
152 (
153 m_notification,
154 GetTitle().utf8_str(),
155 GetMessage().utf8_str(),
156 icon
157 ) )
158 {
159 wxLogDebug(wxS("notify_notification_update() unexpectedly failed."));
160 }
161 }
162
163
164 // Set the notification parameters not specified during creation.
165 notify_notification_set_timeout
166 (
167 m_notification,
168 timeout == Timeout_Auto ? NOTIFY_EXPIRES_DEFAULT
169 : timeout == Timeout_Never ? NOTIFY_EXPIRES_NEVER
170 : 1000*timeout
171 );
172
173 notify_notification_set_urgency(m_notification, urgency);
174
175
176 // Finally do show the notification.
177 wxGtkError error;
178 if ( !notify_notification_show(m_notification, error.Out()) )
179 {
180 wxLogDebug("Failed to shown notification: %s", error.GetMessage());
181
182 return false;
183 }
184
185 return true;
186 }
187
188 bool wxNotificationMessage::Close()
189 {
190 wxCHECK_MSG( m_notification, false,
191 wxS("Can't close not shown notification.") );
192
193 wxGtkError error;
194 if ( !notify_notification_close(m_notification, error.Out()) )
195 {
196 wxLogDebug("Failed to hide notification: %s", error.GetMessage());
197
198 return false;
199 }
200
201 return true;
202 }
203
204 wxNotificationMessage::~wxNotificationMessage()
205 {
206 if ( m_notification )
207 g_object_unref(m_notification);
208 }
209
210 #endif // wxUSE_NOTIFICATION_MESSAGE && wxUSE_LIBNOTIFY