summaryrefslogtreecommitdiffstats
path: root/xchat/xchat-2.8.8-link-against-libnotify.patch
blob: 6dad938ea005257d31c3a92574960983bfa7737b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
From: Christopher Aillon <caillon@redhat.com>
Date: Thu, 7 Apr 2011 19:34:14 -0700
Subject: [PATCH] Link directly against libnotify

Dynamically loading the library isn't ideal since the soname
can change silently on us.  Additionally, notify-send is
shipped as part of libnotify, so we aren't actually bringing
in a new dependency.  Since we'd need to patch the source and
rebuild for new sonames anyway, there's little benefit to
dynamically loading libnotify.

Plus, this has the benefit of cleaning up the code, as well as
ensuring we'll catch any future soname changes sooner.

https://bugzilla.redhat.com/show_bug.cgi?id=693362
https://sourceforge.net/tracker/?func=detail&aid=3280223&group_id=239&atid=100239
---
 configure.in             |   23 +++++++
 src/fe-gtk/plugin-tray.c |  144 ++++++++++-------------------------------------
 2 files changed, 55 insertions(+), 112 deletions(-)

diff -p -U8 xchat-2.8.8/configure.in.libnotifyso4 xchat-2.8.8/configure.in
--- xchat-2.8.8/configure.in.libnotifyso4	2010-05-29 23:01:16.000000000 -0700
+++ xchat-2.8.8/configure.in	2011-04-07 19:27:00.448137113 -0700
@@ -34,16 +34,17 @@ AH_VERBATIM([PREFIX],[#undef PREFIX])
 AH_VERBATIM([XCHATLIBDIR],[#undef XCHATLIBDIR])
 AH_VERBATIM([XCHATSHAREDIR],[#undef XCHATSHAREDIR])
 AH_VERBATIM([SOCKS],[#undef SOCKS])
 AH_VERBATIM([USE_MSPROXY],[#undef USE_MSPROXY])
 dnl AH_VERBATIM([USE_GNOME],[#undef USE_GNOME])
 AH_VERBATIM([USE_SHM],[#undef USE_SHM])
 AH_VERBATIM([USE_GTKSPELL],[#undef USE_GTKSPELL])
 AH_VERBATIM([USE_LIBSEXY],[#undef USE_LIBSEXY])
+AH_VERBATIM([USE_LIBNOTIFY],[#undef USE_LIBNOTIFY])
 AH_VERBATIM([USE_IPV6],[#undef USE_IPV6])
 AH_VERBATIM([USE_MMX],[#undef USE_MMX])
 AH_VERBATIM([USE_OPENSSL],[#undef USE_OPENSSL])
 AH_VERBATIM([USE_PLUGIN],[#undef USE_PLUGIN])
 AH_VERBATIM([USE_XFT],[#undef USE_XFT])
 AH_VERBATIM([USE_XLIB],[#undef USE_XLIB])
 AH_VERBATIM([USE_SIGACTION],[#undef USE_SIGACTION])
 AH_VERBATIM([USING_FREEBSD],[#undef USING_FREEBSD])
@@ -126,16 +127,20 @@ AC_ARG_ENABLE(tcl,
 AC_ARG_ENABLE(plugin,
 [  --disable-plugin        disable plugin support],
         plugin=$enableval, plugin=yes)
 
 AC_ARG_ENABLE(dbus,
 [  --disable-dbus          disable DBUS support],
         dbus=$enableval, dbus=yes)
 
+AC_ARG_ENABLE(libnotify,
+[  --disable-libnotify     disable libnotify support],
+        libnotify=$enableval, libnotify=yes)
+
 AC_ARG_ENABLE(mmx,
 [  --disable-mmx           disable MMX assembly routines],
         mmx=$enableval, mmx=yes)
 
 AC_ARG_ENABLE(shm,
 [  --enable-shm            enable use of XShm for fast tinting (default: no)],
         shm=$enableval, shm=no)
 
@@ -482,16 +487,32 @@ if test "x$dbus" = "xyes" ; then
 
 		DBUS_SERVICES_DIR="$DATADIR/dbus-1/services"
 		AC_SUBST(DBUS_SERVICES_DIR)
 		AC_DEFINE_UNQUOTED(DBUS_SERVICES_DIR, "$DBUS_SERVICES_DIR", [Where services dir for DBUS is])
 	fi
 fi
 
 dnl *********************************************************************
+dnl ** LIBNOTIFY ********************************************************
+dnl *********************************************************************
+
+if test "x$libnotify" = "xyes" ; then
+	PKG_CHECK_MODULES(LIBNOTIFY, libnotify >= 0.4, [], [
+		AC_MSG_RESULT(no)
+		libnotify=no
+	])
+	if test "$libnotify" != "no" ; then
+		GUI_LIBS="$GUI_LIBS $LIBNOTIFY_LIBS"
+		GUI_CFLAGS="$GUI_CFLAGS $LIBNOTIFY_CFLAGS"
+		AC_DEFINE(USE_LIBNOTIFY)
+	fi
+fi
+
+dnl *********************************************************************
 dnl ** SPELL ************************************************************
 dnl *********************************************************************
 
 if test "$spell" = "gtkspell" ; then
 	PKG_CHECK_MODULES(GTKSPELL, gtkspell-2.0 >= 2.0.2, [], [
 		AC_MSG_RESULT(no)
 		spell=no
 	])
@@ -519,16 +540,17 @@ if test "$spell" = "static" ; then
 fi
 
 dnl *********************************************************************
 dnl ** CONDITIONALS *****************************************************
 dnl *********************************************************************
 
 AM_CONDITIONAL(USE_OPENSSL, test "x$openssl" = "xyes")
 AM_CONDITIONAL(USE_LIBSEXY, test "x$spell" = "xstatic")
+AM_CONDITIONAL(USE_LIBNOTIFY, test "x$libnotify" = "xyes")
 AM_CONDITIONAL(DO_TEXT, test "x$textfe" = "xyes")
 AM_CONDITIONAL(DO_GTK, test "x$gtkfe" = "xyes")
 AM_CONDITIONAL(DO_PERL, test "x$perl" = "xyes")
 AM_CONDITIONAL(DO_PYTHON, test "x$python" = "xyes")
 AM_CONDITIONAL(DO_TCL, test "x$tcl" = "xyes")
 AM_CONDITIONAL(DO_PLUGIN, test "x$plugin" = "xyes")
 AM_CONDITIONAL(USE_DBUS, test "x$dbus" = "xyes")
 AM_CONDITIONAL(DO_GCONF, test "x$GCONFTOOL" != "xno")
@@ -807,16 +829,17 @@ echo mmx tinting ......... : $mmx\	spell
 echo XShm tinting ........ : $shm\	plugin interface ...... : $plugin
 if test "$xft" = no; then
   echo text backend ........ : pango\	nls/gettext ........... : $USE_NLS
 else
   echo text backend ........ : xft\	nls/gettext ........... : $USE_NLS
 fi
 echo openssl support ..... : $openssl\	ipv6 support .......... : $ipv6
 echo dbus support ........ : $dbus\	msproxy ntlm \(ISA\) .... : $have_ntlm
+echo libnotify support ... : $libnotify
 echo
 echo The binary will be installed in $prefix/bin
 echo
 
 if test "$gtkfe" = no; then
 	echo Warning: The GTK \(GUI\) frontend will not be built.
 	echo
 fi
diff -p -U8 xchat-2.8.8/src/fe-gtk/plugin-tray.c.libnotifyso4 xchat-2.8.8/src/fe-gtk/plugin-tray.c
--- xchat-2.8.8/src/fe-gtk/plugin-tray.c.libnotifyso4	2011-04-07 17:57:27.524307905 -0700
+++ xchat-2.8.8/src/fe-gtk/plugin-tray.c	2011-04-07 19:18:33.429475719 -0700
@@ -10,17 +10,27 @@
 #include "../common/fe.h"
 #include "../common/util.h"
 #include "fe-gtk.h"
 #include "pixmaps.h"
 #include "maingui.h"
 #include "menu.h"
 #include <gtk/gtk.h>
 
-#define LIBNOTIFY
+#ifdef USE_LIBNOTIFY
+#include <libnotify/notify.h>
+#ifndef NOTIFY_CHECK_VERSION
+#define NOTIFY_CHECK_VERSION(x,y,z) 0
+#endif
+#if NOTIFY_CHECK_VERSION(0,7,0)
+#define XC_NOTIFY_NEW(a,b,c,d) notify_notification_new(a,b,c)
+#else
+#define XC_NOTIFY_NEW(a,b,c,d) notify_notification_new(a,b,c,d)
+#endif
+#endif
 
 typedef enum	/* current icon status */
 {
 	TS_NONE,
 	TS_MESSAGE,
 	TS_HIGHLIGHT,
 	TS_FILEOFFER,
 	TS_CUSTOM /* plugin */
@@ -112,90 +122,16 @@ tray_count_networks (void)
 
 void
 fe_tray_set_tooltip (const char *text)
 {
 	if (sticon)
 		gtk_status_icon_set_tooltip (sticon, text);
 }
 
-#ifdef LIBNOTIFY
-
-/* dynamic access to libnotify.so */
-
-static void *nn_mod = NULL;
-/* prototypes */
-static gboolean (*nn_init) (char *);
-static void (*nn_uninit) (void);
-/* recent versions of libnotify don't take the fourth GtkWidget argument, but passing an
- * extra NULL argument will be fine */
-static void *(*nn_new) (const gchar *summary, const gchar *message, const gchar *icon, gpointer dummy);
-static gboolean (*nn_show) (void *noti, GError **error);
-static void (*nn_set_timeout) (void *noti, gint timeout);
-
-static void
-libnotify_cleanup (void)
-{
-	if (nn_mod)
-	{
-		nn_uninit ();
-		g_module_close (nn_mod);
-		nn_mod = NULL;
-	}
-}
-
-static gboolean
-libnotify_notify_new (const char *title, const char *text, GtkStatusIcon *icon)
-{
-	void *noti;
-
-	if (!nn_mod)
-	{
-		nn_mod = g_module_open ("libnotify", G_MODULE_BIND_LAZY);
-		if (!nn_mod)
-		{
-			nn_mod = g_module_open ("libnotify.so.1", G_MODULE_BIND_LAZY);
-			if (!nn_mod)
-				return FALSE;
-		}
-
-		if (!g_module_symbol (nn_mod, "notify_init", (gpointer)&nn_init))
-			goto bad;
-		if (!g_module_symbol (nn_mod, "notify_uninit", (gpointer)&nn_uninit))
-			goto bad;
-		if (!g_module_symbol (nn_mod, "notify_notification_new", (gpointer)&nn_new))
-			goto bad;
-		if (!g_module_symbol (nn_mod, "notify_notification_show", (gpointer)&nn_show))
-			goto bad;
-		if (!g_module_symbol (nn_mod, "notify_notification_set_timeout", (gpointer)&nn_set_timeout))
-			goto bad;
-		if (!nn_init (PACKAGE_NAME))
-			goto bad;
-	}
-
-	text = strip_color (text, -1, STRIP_ALL|STRIP_ESCMARKUP);
-	title = strip_color (title, -1, STRIP_ALL);
-	noti = nn_new (title, text, XCHATSHAREDIR"/pixmaps/xchat.png", NULL);
-	g_free ((char *)title);
-	g_free ((char *)text);
-
-	nn_set_timeout (noti, prefs.input_balloon_time*1000);
-	nn_show (noti, NULL);
-	g_object_unref (G_OBJECT (noti));
-
-	return TRUE;
-
-bad:
-	g_module_close (nn_mod);
-	nn_mod = NULL;
-	return FALSE;
-}
-
-#endif
-
 void
 fe_tray_set_balloon (const char *title, const char *text)
 {
 #ifndef WIN32
 	const char *argv[8];
 	const char *path;
 	char time[16];
 	WinStatus ws;
@@ -208,52 +144,36 @@ fe_tray_set_balloon (const char *title, 
 	/* bit 1 of flags means "no balloons unless hidden/iconified" */
 	if (ws != WS_HIDDEN && (prefs.gui_tray_flags & 2))
 		return;
 
 	/* FIXME: this should close the current balloon */
 	if (!text)
 		return;
 
-#ifdef LIBNOTIFY
-	/* try it via libnotify.so */
-	if (libnotify_notify_new (title, text, sticon))
-		return;	/* success */
-#endif
+#ifdef USE_LIBNOTIFY
+	NotifyNotification *notification;
+	char *notify_text, *notify_title;
 
-	/* try it the crude way */
-	path = g_find_program_in_path ("notify-send");
-	if (path)
-	{
-		sprintf(time, "%d000",prefs.input_balloon_time);
-		argv[0] = path;
-		argv[1] = "-i";
-		argv[2] = "gtk-dialog-info";
-		if (access (XCHATSHAREDIR"/pixmaps/xchat.png", R_OK) == 0)
-			argv[2] = XCHATSHAREDIR"/pixmaps/xchat.png";
-		argv[3] = "-t";
-		argv[4] = time;
-		argv[5] = title;
-		text = strip_color (text, -1, STRIP_ALL|STRIP_ESCMARKUP);
-		argv[6] = text;
-		argv[7] = NULL;
-		xchat_execv (argv);
-		g_free ((char *)path);
-		g_free ((char *)text);
-	}
-	else
-	{
-		/* show this error only once */
-		static unsigned char said_it = FALSE;
-		if (!said_it)
-		{
-			said_it = TRUE;
-			fe_message (_("Cannot find 'notify-send' to open balloon alerts.\nPlease install libnotify."), FE_MSG_ERROR);
-		}
-	}
+	if (!notify_is_initted())
+		notify_init(PACKAGE_NAME);
+
+	notify_text = strip_color (text, -1, STRIP_ALL|STRIP_ESCMARKUP);
+	notify_title = strip_color (title, -1, STRIP_ALL);
+
+	notification = XC_NOTIFY_NEW (notify_title, notify_text, XCHATSHAREDIR"/pixmaps/xchat.png", NULL);
+
+	g_free ((char *)notify_title);
+	g_free ((char *)notify_text);
+
+	notify_notification_set_timeout (notification, prefs.input_balloon_time*1000);
+	notify_notification_show (notification, NULL);
+
+	g_object_unref (notification);
+#endif
 #endif
 }
 
 static void
 tray_set_balloonf (const char *text, const char *format, ...)
 {
 	va_list args;
 	char *buf;
@@ -840,13 +760,13 @@ tray_plugin_init (xchat_plugin *plugin_h
 	return 1;       /* return 1 for success */
 }
 
 int
 tray_plugin_deinit (xchat_plugin *plugin_handle)
 {
 #ifdef WIN32
 	tray_cleanup ();
-#elif defined(LIBNOTIFY)
-	libnotify_cleanup ();
+#elif defined(USE_LIBNOTIFY)
+	notify_uninit ();
 #endif
 	return 1;
 }