From: Vadim Zeitlin Date: Fri, 27 Jul 2012 15:36:54 +0000 (+0000) Subject: Implement wxNotificationMessage using libnotify in wxGTK. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/afbf46a31740bb05af12a8ba0069345a2c9aba46 Implement wxNotificationMessage using libnotify in wxGTK. Use libnotify -- if detected by configure -- to provide native notifications in wxGTK. Our API maps to libnotify one in rather straightforward way, we might consider extending it to cover more of libnotify functionality (categories, user-defined icons and, especially, actions) later. Also update the dialogs sample to show another kind of notification and the documentation to clarify the behaviour of various methods. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72218 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/Makefile.in b/Makefile.in index 4e24080c53..a75beeda7f 100644 --- a/Makefile.in +++ b/Makefile.in @@ -2918,6 +2918,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_GUI_HDR = \ wx/gtk/menuitem.h \ wx/gtk/msgdlg.h \ wx/gtk/notebook.h \ + wx/gtk/notifmsg.h \ wx/gtk/print.h \ wx/gtk/radiobox.h \ wx/gtk/radiobut.h \ @@ -2973,6 +2974,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_3_GUI_HDR = \ wx/gtk/menuitem.h \ wx/gtk/msgdlg.h \ wx/gtk/notebook.h \ + wx/gtk/notifmsg.h \ wx/gtk/print.h \ wx/gtk/radiobox.h \ wx/gtk/radiobut.h \ @@ -5525,6 +5527,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___GUI_SRC_OBJECTS = \ monodll_gtk_msgdlg.o \ monodll_gtk_nativewin.o \ monodll_gtk_notebook.o \ + monodll_gtk_notifmsg.o \ monodll_gtk_print.o \ monodll_gtk_radiobox.o \ monodll_gtk_radiobut.o \ @@ -5581,6 +5584,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_3___GUI_SRC_OBJECTS = \ monodll_gtk_msgdlg.o \ monodll_gtk_nativewin.o \ monodll_gtk_notebook.o \ + monodll_gtk_notifmsg.o \ monodll_gtk_print.o \ monodll_gtk_radiobox.o \ monodll_gtk_radiobut.o \ @@ -7723,6 +7727,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___GUI_SRC_OBJECTS_1 = \ monolib_gtk_msgdlg.o \ monolib_gtk_nativewin.o \ monolib_gtk_notebook.o \ + monolib_gtk_notifmsg.o \ monolib_gtk_print.o \ monolib_gtk_radiobox.o \ monolib_gtk_radiobut.o \ @@ -7779,6 +7784,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_3___GUI_SRC_OBJECTS_1 = \ monolib_gtk_msgdlg.o \ monolib_gtk_nativewin.o \ monolib_gtk_notebook.o \ + monolib_gtk_notifmsg.o \ monolib_gtk_print.o \ monolib_gtk_radiobox.o \ monolib_gtk_radiobut.o \ @@ -10097,6 +10103,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___GUI_SRC_OBJECTS_2 = \ coredll_gtk_msgdlg.o \ coredll_gtk_nativewin.o \ coredll_gtk_notebook.o \ + coredll_notifmsg.o \ coredll_gtk_print.o \ coredll_gtk_radiobox.o \ coredll_gtk_radiobut.o \ @@ -10153,6 +10160,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_3___GUI_SRC_OBJECTS_2 = \ coredll_gtk_msgdlg.o \ coredll_gtk_nativewin.o \ coredll_gtk_notebook.o \ + coredll_notifmsg.o \ coredll_gtk_print.o \ coredll_gtk_radiobox.o \ coredll_gtk_radiobut.o \ @@ -11740,6 +11748,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___GUI_SRC_OBJECTS_3 = \ corelib_gtk_msgdlg.o \ corelib_gtk_nativewin.o \ corelib_gtk_notebook.o \ + corelib_notifmsg.o \ corelib_gtk_print.o \ corelib_gtk_radiobox.o \ corelib_gtk_radiobut.o \ @@ -11796,6 +11805,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_3___GUI_SRC_OBJECTS_3 = \ corelib_gtk_msgdlg.o \ corelib_gtk_nativewin.o \ corelib_gtk_notebook.o \ + corelib_notifmsg.o \ corelib_gtk_print.o \ corelib_gtk_radiobox.o \ corelib_gtk_radiobut.o \ @@ -20111,6 +20121,12 @@ monodll_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONODLL_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1_WXUNIV_0@monodll_gtk_notebook.o: $(srcdir)/src/gtk/notebook.cpp $(MONODLL_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1_WXUNIV_0@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/gtk/notebook.cpp +@COND_TOOLKIT_GTK_TOOLKIT_VERSION_3_USE_GUI_1_WXUNIV_0@monodll_gtk_notifmsg.o: $(srcdir)/src/gtk/notifmsg.cpp $(MONODLL_ODEP) +@COND_TOOLKIT_GTK_TOOLKIT_VERSION_3_USE_GUI_1_WXUNIV_0@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/gtk/notifmsg.cpp + +@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1_WXUNIV_0@monodll_gtk_notifmsg.o: $(srcdir)/src/gtk/notifmsg.cpp $(MONODLL_ODEP) +@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1_WXUNIV_0@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/gtk/notifmsg.cpp + @COND_TOOLKIT_GTK_TOOLKIT_VERSION_3_USE_GUI_1_WXUNIV_0@monodll_gtk_print.o: $(srcdir)/src/gtk/print.cpp $(MONODLL_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION_3_USE_GUI_1_WXUNIV_0@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/gtk/print.cpp @@ -25805,6 +25821,12 @@ monolib_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONOLIB_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1_WXUNIV_0@monolib_gtk_notebook.o: $(srcdir)/src/gtk/notebook.cpp $(MONOLIB_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1_WXUNIV_0@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/gtk/notebook.cpp +@COND_TOOLKIT_GTK_TOOLKIT_VERSION_3_USE_GUI_1_WXUNIV_0@monolib_gtk_notifmsg.o: $(srcdir)/src/gtk/notifmsg.cpp $(MONOLIB_ODEP) +@COND_TOOLKIT_GTK_TOOLKIT_VERSION_3_USE_GUI_1_WXUNIV_0@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/gtk/notifmsg.cpp + +@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1_WXUNIV_0@monolib_gtk_notifmsg.o: $(srcdir)/src/gtk/notifmsg.cpp $(MONOLIB_ODEP) +@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1_WXUNIV_0@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/gtk/notifmsg.cpp + @COND_TOOLKIT_GTK_TOOLKIT_VERSION_3_USE_GUI_1_WXUNIV_0@monolib_gtk_print.o: $(srcdir)/src/gtk/print.cpp $(MONOLIB_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION_3_USE_GUI_1_WXUNIV_0@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/gtk/print.cpp @@ -31670,6 +31692,12 @@ coredll_win32.o: $(srcdir)/src/univ/themes/win32.cpp $(COREDLL_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1_WXUNIV_0@coredll_gtk_notebook.o: $(srcdir)/src/gtk/notebook.cpp $(COREDLL_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1_WXUNIV_0@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/gtk/notebook.cpp +@COND_TOOLKIT_GTK_TOOLKIT_VERSION_3_USE_GUI_1_WXUNIV_0@coredll_notifmsg.o: $(srcdir)/src/gtk/notifmsg.cpp $(COREDLL_ODEP) +@COND_TOOLKIT_GTK_TOOLKIT_VERSION_3_USE_GUI_1_WXUNIV_0@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/gtk/notifmsg.cpp + +@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1_WXUNIV_0@coredll_notifmsg.o: $(srcdir)/src/gtk/notifmsg.cpp $(COREDLL_ODEP) +@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1_WXUNIV_0@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/gtk/notifmsg.cpp + @COND_TOOLKIT_GTK_TOOLKIT_VERSION_3_USE_GUI_1_WXUNIV_0@coredll_gtk_print.o: $(srcdir)/src/gtk/print.cpp $(COREDLL_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION_3_USE_GUI_1_WXUNIV_0@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/gtk/print.cpp @@ -35924,6 +35952,12 @@ corelib_win32.o: $(srcdir)/src/univ/themes/win32.cpp $(CORELIB_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1_WXUNIV_0@corelib_gtk_notebook.o: $(srcdir)/src/gtk/notebook.cpp $(CORELIB_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1_WXUNIV_0@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/gtk/notebook.cpp +@COND_TOOLKIT_GTK_TOOLKIT_VERSION_3_USE_GUI_1_WXUNIV_0@corelib_notifmsg.o: $(srcdir)/src/gtk/notifmsg.cpp $(CORELIB_ODEP) +@COND_TOOLKIT_GTK_TOOLKIT_VERSION_3_USE_GUI_1_WXUNIV_0@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/gtk/notifmsg.cpp + +@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1_WXUNIV_0@corelib_notifmsg.o: $(srcdir)/src/gtk/notifmsg.cpp $(CORELIB_ODEP) +@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1_WXUNIV_0@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/gtk/notifmsg.cpp + @COND_TOOLKIT_GTK_TOOLKIT_VERSION_3_USE_GUI_1_WXUNIV_0@corelib_gtk_print.o: $(srcdir)/src/gtk/print.cpp $(CORELIB_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION_3_USE_GUI_1_WXUNIV_0@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/gtk/print.cpp diff --git a/build/bakefiles/files.bkl b/build/bakefiles/files.bkl index f3983d32c0..5643fc6a6f 100644 --- a/build/bakefiles/files.bkl +++ b/build/bakefiles/files.bkl @@ -1162,6 +1162,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! src/gtk/msgdlg.cpp src/gtk/nativewin.cpp src/gtk/notebook.cpp + src/gtk/notifmsg.cpp src/gtk/print.cpp src/gtk/radiobox.cpp src/gtk/radiobut.cpp @@ -1222,6 +1223,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! wx/gtk/menuitem.h wx/gtk/msgdlg.h wx/gtk/notebook.h + wx/gtk/notifmsg.h wx/gtk/print.h wx/gtk/radiobox.h wx/gtk/radiobut.h diff --git a/configure b/configure index 332ee93691..785a45cfa7 100755 --- a/configure +++ b/configure @@ -980,6 +980,8 @@ HILDON2_LIBS HILDON2_CFLAGS HILDON_LIBS HILDON_CFLAGS +LIBNOTIFY_LIBS +LIBNOTIFY_CFLAGS GNOMEVFS_LIBS GNOMEVFS_CFLAGS LIBGNOMEPRINTUI_LIBS @@ -1126,6 +1128,7 @@ with_libmspack with_gtkprint with_gnomeprint with_gnomevfs +with_libnotify with_hildon with_opengl with_dmalloc @@ -1429,6 +1432,8 @@ LIBGNOMEPRINTUI_CFLAGS LIBGNOMEPRINTUI_LIBS GNOMEVFS_CFLAGS GNOMEVFS_LIBS +LIBNOTIFY_CFLAGS +LIBNOTIFY_LIBS HILDON_CFLAGS HILDON_LIBS HILDON2_CFLAGS @@ -2349,6 +2354,7 @@ Optional Packages: --without-gtkprint don't use GTK printing support --without-gnomeprint don't use GNOME printing libraries --with-gnomevfs use GNOME VFS for associating MIME types + --with-libnotify use libnotify for notifications --with-hildon use Hildon framework for Nokia 770/800/810 --with-opengl use OpenGL (or Mesa) --with-dmalloc use dmalloc library (http://dmalloc.com/) @@ -2425,6 +2431,10 @@ Some influential environment variables: C compiler flags for GNOMEVFS, overriding pkg-config GNOMEVFS_LIBS linker flags for GNOMEVFS, overriding pkg-config + LIBNOTIFY_CFLAGS + C compiler flags for LIBNOTIFY, overriding pkg-config + LIBNOTIFY_LIBS + linker flags for LIBNOTIFY, overriding pkg-config HILDON_CFLAGS C compiler flags for HILDON, overriding pkg-config HILDON_LIBS linker flags for HILDON, overriding pkg-config @@ -5181,6 +5191,50 @@ fi $as_echo "$result" >&6; } + withstring= + defaultval=$wxUSE_ALL_FEATURES + if test -z "$defaultval"; then + if test x"$withstring" = xwithout; then + defaultval=yes + else + defaultval=no + fi + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --${withstring:-with}-libnotify" >&5 +$as_echo_n "checking for --${withstring:-with}-libnotify... " >&6; } + +# Check whether --with-libnotify was given. +if test "${with_libnotify+set}" = set; then : + withval=$with_libnotify; + if test "$withval" = yes; then + wx_cv_use_libnotify='wxUSE_LIBNOTIFY=yes' + else + wx_cv_use_libnotify='wxUSE_LIBNOTIFY=no' + fi + +else + + wx_cv_use_libnotify='wxUSE_LIBNOTIFY=${'DEFAULT_wxUSE_LIBNOTIFY":-$defaultval}" + +fi + + + eval "$wx_cv_use_libnotify" + + if test x"$withstring" = xwithout; then + if test $wxUSE_LIBNOTIFY = yes; then + result=no + else + result=yes + fi + else + result=$wxUSE_LIBNOTIFY + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $result" >&5 +$as_echo "$result" >&6; } + + withstring= defaultval=$wxUSE_ALL_FEATURES if test -z "$defaultval"; then @@ -33972,6 +34026,94 @@ $as_echo "yes" >&6; } $as_echo "#define wxUSE_LIBGNOMEVFS 1" >>confdefs.h +fi + fi + fi + + if test "$wxUSE_NOTIFICATION_MESSAGE" = "yes" ; then + if test "$wxUSE_LIBNOTIFY" = "yes" ; then + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBNOTIFY" >&5 +$as_echo_n "checking for LIBNOTIFY... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$LIBNOTIFY_CFLAGS"; then + pkg_cv_LIBNOTIFY_CFLAGS="$LIBNOTIFY_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libnotify >= 0.7\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libnotify >= 0.7") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBNOTIFY_CFLAGS=`$PKG_CONFIG --cflags "libnotify >= 0.7" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi +if test -n "$PKG_CONFIG"; then + if test -n "$LIBNOTIFY_LIBS"; then + pkg_cv_LIBNOTIFY_LIBS="$LIBNOTIFY_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libnotify >= 0.7\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libnotify >= 0.7") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_LIBNOTIFY_LIBS=`$PKG_CONFIG --libs "libnotify >= 0.7" 2>/dev/null` +else + pkg_failed=yes +fi + fi +else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + LIBNOTIFY_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libnotify >= 0.7"` + else + LIBNOTIFY_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libnotify >= 0.7"` + fi + # Put the nasty error message in config.log where it belongs + echo "$LIBNOTIFY_PKG_ERRORS" >&5 + + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: libnotify not found, wxNotificationMessage will use generic implementation." >&5 +$as_echo "$as_me: WARNING: libnotify not found, wxNotificationMessage will use generic implementation." >&2;} + + +elif test $pkg_failed = untried; then + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: libnotify not found, wxNotificationMessage will use generic implementation." >&5 +$as_echo "$as_me: WARNING: libnotify not found, wxNotificationMessage will use generic implementation." >&2;} + + +else + LIBNOTIFY_CFLAGS=$pkg_cv_LIBNOTIFY_CFLAGS + LIBNOTIFY_LIBS=$pkg_cv_LIBNOTIFY_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + + GUI_TK_LIBRARY="$GUI_TK_LIBRARY $LIBNOTIFY_LIBS" + CFLAGS="$LIBNOTIFY_CFLAGS $CFLAGS" + CXXFLAGS="$LIBNOTIFY_CFLAGS $CXXFLAGS" + $as_echo "#define wxUSE_LIBNOTIFY 1" >>confdefs.h + + fi fi fi @@ -37353,6 +37495,9 @@ case "$TOOLKIT" in if test "$wxUSE_LIBGNOMEVFS" = "yes" ; then TOOLKIT_EXTRA="$TOOLKIT_EXTRA gnomevfs" fi + if test "$wxUSE_LIBNOTIFY" = "yes" ; then + TOOLKIT_EXTRA="$TOOLKIT_EXTRA libnotify" + fi if test "$wxUSE_LIBHILDON" = "yes"; then TOOLKIT_EXTRA="$TOOLKIT_EXTRA hildon" fi diff --git a/configure.in b/configure.in index 77e9c4e87b..b54ebe2332 100644 --- a/configure.in +++ b/configure.in @@ -591,6 +591,7 @@ WX_ARG_WITH(libmspack, [ --with-libmspack use libmspack (CHM help fi WX_ARG_WITHOUT(gtkprint, [ --without-gtkprint don't use GTK printing support], wxUSE_GTKPRINT) WX_ARG_WITHOUT(gnomeprint, [ --without-gnomeprint don't use GNOME printing libraries], wxUSE_LIBGNOMEPRINT) WX_ARG_WITH(gnomevfs, [ --with-gnomevfs use GNOME VFS for associating MIME types], wxUSE_LIBGNOMEVFS) +WX_ARG_WITH(libnotify, [ --with-libnotify use libnotify for notifications], wxUSE_LIBNOTIFY) WX_ARG_WITH(hildon, [ --with-hildon use Hildon framework for Nokia 770/800/810], wxUSE_LIBHILDON) WX_ARG_WITH(opengl, [ --with-opengl use OpenGL (or Mesa)], wxUSE_OPENGL) @@ -5665,6 +5666,22 @@ if test "$WXGTK2" = 1; then fi fi + if test "$wxUSE_NOTIFICATION_MESSAGE" = "yes" ; then + if test "$wxUSE_LIBNOTIFY" = "yes" ; then + PKG_CHECK_MODULES(LIBNOTIFY, [libnotify >= 0.7], + [ + GUI_TK_LIBRARY="$GUI_TK_LIBRARY $LIBNOTIFY_LIBS" + CFLAGS="$LIBNOTIFY_CFLAGS $CFLAGS" + CXXFLAGS="$LIBNOTIFY_CFLAGS $CXXFLAGS" + AC_DEFINE(wxUSE_LIBNOTIFY) + ], + [ + AC_MSG_WARN([libnotify not found, wxNotificationMessage will use generic implementation.]) + ] + ) + fi + fi + if test "$wxUSE_LIBHILDON" = "yes" ; then PKG_CHECK_MODULES(HILDON, [hildon-lgpl >= 0.9], @@ -7981,6 +7998,9 @@ case "$TOOLKIT" in if test "$wxUSE_LIBGNOMEVFS" = "yes" ; then TOOLKIT_EXTRA="$TOOLKIT_EXTRA gnomevfs" fi + if test "$wxUSE_LIBNOTIFY" = "yes" ; then + TOOLKIT_EXTRA="$TOOLKIT_EXTRA libnotify" + fi if test "$wxUSE_LIBHILDON" = "yes"; then TOOLKIT_EXTRA="$TOOLKIT_EXTRA hildon" fi diff --git a/debian/control.in b/debian/control.in index 2a5d19dfe2..66d49e95de 100644 --- a/debian/control.in +++ b/debian/control.in @@ -1,7 +1,7 @@ Source: wxwidgets=V Section: libs Priority: optional -Build-Depends: debhelper (>=4.0), bc, flex, bison, gettext, libgtk2.0-dev, =PY, =PY-dev, zlib1g-dev, libjpeg62-dev, libpng12-dev, libtiff4-dev, libsm-dev, libgl1-mesa-dev | libgl-dev, libglu1-mesa-dev | libglu-dev, libesd0-dev, libgnomeprintui2.2-dev, libgconf2-dev, libgstreamer0.10-dev, libgstreamer-plugins-base0.10-dev +Build-Depends: debhelper (>=4.0), bc, flex, bison, gettext, libgtk2.0-dev, =PY, =PY-dev, zlib1g-dev, libjpeg62-dev, libpng12-dev, libtiff4-dev, libsm-dev, libgl1-mesa-dev | libgl-dev, libglu1-mesa-dev | libglu-dev, libesd0-dev, libgnomeprintui2.2-dev, libgconf2-dev, libgstreamer0.10-dev, libgstreamer-plugins-base0.10-dev, libnotify-dev Maintainer: wxWidgets dev-team Standards-Version: 3.6.2.1 diff --git a/docs/changes.txt b/docs/changes.txt index 5e1d4b56bc..bbb0e9ec63 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -539,6 +539,7 @@ All (GUI): wxGTK: - Allow building wxGTK3 with Broadway backend (Kolya Kosenko). +- Provide native implementation of wxNotificationMessage using libnotify. - Improve drag-and-drop of URLs. wxMSW: diff --git a/include/wx/gtk/notifmsg.h b/include/wx/gtk/notifmsg.h new file mode 100644 index 0000000000..195991e516 --- /dev/null +++ b/include/wx/gtk/notifmsg.h @@ -0,0 +1,47 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/notifmsg.h +// Purpose: wxNotificationMessage for wxGTK. +// Author: Vadim Zeitlin +// Created: 2012-07-25 +// RCS-ID: $Id$ +// Copyright: (c) 2012 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _WX_GTK_NOTIFMSG_H_ +#define _WX_GTK_NOTIFMSG_H_ + +typedef struct _NotifyNotification NotifyNotification; + +// ---------------------------------------------------------------------------- +// wxNotificationMessage +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxNotificationMessage : public wxNotificationMessageBase +{ +public: + wxNotificationMessage() { Init(); } + wxNotificationMessage(const wxString& title, + const wxString& message = wxString(), + wxWindow *parent = NULL, + int flags = wxICON_INFORMATION) + : wxNotificationMessageBase(title, message, parent, flags) + { + Init(); + } + + virtual ~wxNotificationMessage(); + + + virtual bool Show(int timeout = Timeout_Auto); + virtual bool Close(); + +private: + void Init() { m_notification = NULL; } + + NotifyNotification* m_notification; + + wxDECLARE_NO_COPY_CLASS(wxNotificationMessage); +}; + +#endif // _WX_GTK_NOTIFMSG_H_ diff --git a/include/wx/notifmsg.h b/include/wx/notifmsg.h index 39a964ec23..2c76226c63 100644 --- a/include/wx/notifmsg.h +++ b/include/wx/notifmsg.h @@ -127,13 +127,14 @@ private: wxDECLARE_NO_COPY_CLASS(wxNotificationMessageBase); }; -#if defined(__WXGTK__) && (wxUSE_LIBHILDON || wxUSE_LIBHILDON2) - #include "wx/gtk/hildon/notifmsg.h" /* - TODO: provide support for - - libnotify (Gnome) - - Growl (http://growl.info/, OS X) + TODO: Implement under OS X using notification centre (10.8+) or + Growl (http://growl.info/) for the previous versions. */ +#if defined(__WXGTK__) && wxUSE_LIBNOTIFY + #include "wx/gtk/notifmsg.h" +#elif defined(__WXGTK__) && (wxUSE_LIBHILDON || wxUSE_LIBHILDON2) + #include "wx/gtk/hildon/notifmsg.h" #elif defined(__WXMSW__) && wxUSE_TASKBARICON && wxUSE_TASKBARICON_BALLOONS #include "wx/msw/notifmsg.h" #else diff --git a/interface/wx/notifmsg.h b/interface/wx/notifmsg.h index 68a8d1ab73..b2561a3bd0 100644 --- a/interface/wx/notifmsg.h +++ b/interface/wx/notifmsg.h @@ -11,10 +11,9 @@ This class allows to show the user a message non intrusively. - Currently it is implemented natively only for the Maemo platform and uses + Currently it is implemented natively for Windows and GTK and uses (non-modal) dialogs for the display of the notifications under the other - platforms but it will be extended to use the platform-specific notifications - in the other ports in the future. + platforms. Notice that this class is not a window and so doesn't derive from wxWindow. @@ -46,6 +45,14 @@ public: wxNotificationMessage(const wxString& title, const wxString& message = wxEmptyString, wxWindow* parent = NULL, int flags = wxICON_INFORMATION); + /** + Destructor does not hide the notification. + + The notification can continue to be shown even after the C++ object was + destroyed, call Close() explicitly if it needs to be hidden. + */ + virtual ~wxNotificationMessage(); + /** Hides the notification. @@ -95,6 +102,11 @@ public: because the current platform may only support default timeout value and also because the user may be able to close the notification. + @note When using native notifications in wxGTK, the timeout is ignored + for the notifications with @c wxICON_WARNING or @c wxICON_ERROR + flags, they always remain shown unless they're explicitly hidden by + the user, i.e. behave as if Timeout_Auto were given. + @return @false if an error occurred. */ virtual bool Show(int timeout = Timeout_Auto); diff --git a/samples/dialogs/dialogs.cpp b/samples/dialogs/dialogs.cpp index d4c7b8f6f6..bc8d2601bb 100644 --- a/samples/dialogs/dialogs.cpp +++ b/samples/dialogs/dialogs.cpp @@ -1747,6 +1747,9 @@ void MyFrame::OnRequestUserAttention(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnNotifMsgAuto(wxCommandEvent& WXUNUSED(event)) { + // Notice that the notification remains shown even after the + // wxNotificationMessage object itself is destroyed so we can show simple + // notifications using temporary objects. if ( !wxNotificationMessage ( "Automatic Notification", @@ -1756,6 +1759,11 @@ void MyFrame::OnNotifMsgAuto(wxCommandEvent& WXUNUSED(event)) { wxLogStatus("Failed to show notification message"); } + + // But it doesn't have to be a temporary, of course. + wxNotificationMessage n("Dummy Warning", "Example of a warning notification."); + n.SetFlags(wxICON_ERROR); + n.Show(5); // Just for testing, use 5 second delay. } void MyFrame::OnNotifMsgShow(wxCommandEvent& WXUNUSED(event)) diff --git a/setup.h.in b/setup.h.in index ca57611858..8d69056356 100644 --- a/setup.h.in +++ b/setup.h.in @@ -822,6 +822,10 @@ * Use the Hildon 2.0 framework */ #define wxUSE_LIBHILDON2 0 +/* + * Use libnotify library. + */ +#define wxUSE_LIBNOTIFY 0 /* * Use libXpm */ diff --git a/setup.h_vms b/setup.h_vms index 9c328ce4a2..20560d56a1 100644 --- a/setup.h_vms +++ b/setup.h_vms @@ -869,6 +869,10 @@ typedef pid_t GPid; * Use the Hildon 2.0 framework */ #define wxUSE_LIBHILDON2 0 +/* + * Use libnotify library. + */ +#define wxUSE_LIBNOTIFY 0 #define wxUSE_DC_TRANSFORM_MATRIX 1 diff --git a/src/gtk/notifmsg.cpp b/src/gtk/notifmsg.cpp new file mode 100644 index 0000000000..8b4b75c076 --- /dev/null +++ b/src/gtk/notifmsg.cpp @@ -0,0 +1,194 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: src/gtk/notifmsg.cpp +// Purpose: wxNotificationMessage for wxGTK using libnotify. +// Author: Vadim Zeitlin +// Created: 2012-07-25 +// RCS-ID: $Id$ +// Copyright: (c) 2012 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_NOTIFICATION_MESSAGE + +#ifndef WX_PRECOMP +#endif // WX_PRECOMP + +#include "wx/notifmsg.h" + +#include + +#include "wx/module.h" + +// General note about error handling: as notifications are meant to be +// non-intrusive, we use wxLogDebug() and not wxLogError() if anything goes +// wrong here to avoid spamming the user with message boxes. As all methods +// return boolean indicating success or failure, the caller could show the +// notification in some other way or notify about the error itself if needed. +#include "wx/gtk/private/error.h" + +// ---------------------------------------------------------------------------- +// A module for cleaning up libnotify on exit. +// ---------------------------------------------------------------------------- + +class wxLibnotifyModule : public wxModule +{ +public: + virtual bool OnInit() + { + // We're initialized on demand. + return true; + } + + virtual void OnExit() + { + if ( notify_is_initted() ) + notify_uninit(); + } + + // Do initialize the library. + static bool Initialize() + { + if ( !notify_is_initted() ) + { + if ( !notify_init(wxTheApp->GetAppName().utf8_str()) ) + return false; + } + + return true; + } + +private: + wxDECLARE_DYNAMIC_CLASS(wxLibnotifyModule); +}; + +wxIMPLEMENT_DYNAMIC_CLASS(wxLibnotifyModule, wxModule); + +// ============================================================================ +// wxNotificationMessage implementation +// ============================================================================ + +bool wxNotificationMessage::Show(int timeout) +{ + if ( !wxLibnotifyModule::Initialize() ) + return false; + + // Determine the GTK+ icon to use from flags and also set the urgency + // appropriately. + const char* icon; + NotifyUrgency urgency; + switch ( GetFlags() ) + { + case wxICON_INFORMATION: + icon = "dialog-information"; + urgency = NOTIFY_URGENCY_LOW; + break; + + case wxICON_WARNING: + icon = "dialog-warning"; + urgency = NOTIFY_URGENCY_NORMAL; + break; + + case wxICON_ERROR: + icon = "dialog-error"; + urgency = NOTIFY_URGENCY_CRITICAL; + break; + + default: + wxFAIL_MSG( "Unknown notification message flags." ); + return false; + } + + // Create the notification or update an existing one if we had already been + // shown before. + if ( !m_notification ) + { + m_notification = notify_notification_new + ( + GetTitle().utf8_str(), + GetMessage().utf8_str(), + icon + ); + if ( !m_notification ) + { + wxLogDebug("Failed to creation notification."); + + return false; + } + } + else + { + if ( !notify_notification_update + ( + m_notification, + GetTitle().utf8_str(), + GetMessage().utf8_str(), + icon + ) ) + { + wxLogDebug(wxS("notify_notification_update() unexpectedly failed.")); + } + } + + + // Set the notification parameters not specified during creation. + notify_notification_set_timeout + ( + m_notification, + timeout == Timeout_Auto ? NOTIFY_EXPIRES_DEFAULT + : timeout == Timeout_Never ? NOTIFY_EXPIRES_NEVER + : 1000*timeout + ); + + notify_notification_set_urgency(m_notification, urgency); + + + // Finally do show the notification. + wxGtkError error; + if ( !notify_notification_show(m_notification, error.Out()) ) + { + wxLogDebug("Failed to shown notification: %s", error.GetMessage()); + + return false; + } + + return true; +} + +bool wxNotificationMessage::Close() +{ + wxCHECK_MSG( m_notification, false, + wxS("Can't close not shown notification.") ); + + wxGtkError error; + if ( !notify_notification_close(m_notification, error.Out()) ) + { + wxLogDebug("Failed to hide notification: %s", error.GetMessage()); + + return false; + } + + return true; +} + +wxNotificationMessage::~wxNotificationMessage() +{ + if ( m_notification ) + g_object_unref(m_notification); +} + +#endif // wxUSE_NOTIFICATION_MESSAGE