From c25400b146f7a7b3b4a29c0efa4daee9d1c49633 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Denis-Courmont?= Date: Tue, 5 May 2020 18:48:06 +0300 Subject: [PATCH] notify: don't depend on any GTK version If there's one in the process use it. If there's none fallback to default VLC icon with the old code. This not only avoids VLC builds depending on GTK, but this should prevent crashes if GTK 2 is present in the process (e.g. through Qt plugin). Adapted to vlc-3.x by "Nicolas Chauvet " --- configure.ac | 2 +- modules/notify/notify.c | 38 ++++++++++++++++++++++---------------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/configure.ac b/configure.ac index 09ac250ff483..a3ef64318561 100644 --- a/configure.ac +++ b/configure.ac @@ -4206,7 +4206,7 @@ AS_IF([test "${enable_osx_notifications}" != "no"], [ dnl dnl Libnotify notification plugin dnl -PKG_ENABLE_MODULES_VLC([NOTIFY], [], [libnotify gtk+-3.0], [libnotify notification], [auto]) +PKG_ENABLE_MODULES_VLC([NOTIFY], [], [libnotify], [libnotify notification], [auto]) dnl dnl libplacebo support diff --git a/modules/notify/notify.c b/modules/notify/notify.c index bd6bba6c32c8..20b7c4acb761 100644 --- a/modules/notify/notify.c +++ b/modules/notify/notify.c @@ -36,10 +36,16 @@ #include #include -#include #include #include +typedef struct GtkIconTheme GtkIconTheme; +enum GtkIconLookupFlags { dummy = 0x7fffffff }; + +__attribute__((weak)) GtkIconTheme *gtk_icon_theme_get_default(void); +__attribute__((weak)) GdkPixbuf *gtk_icon_theme_load_icon(GtkIconTheme *, + const char *icon_name, int size, enum GtkIconLookupFlags, GError **); + #ifndef NOTIFY_CHECK_VERSION # define NOTIFY_CHECK_VERSION(x,y,z) 0 #endif @@ -222,30 +228,30 @@ static int ItemChange( vlc_object_t *p_this, const char *psz_var, GError *p_error = NULL; pix = gdk_pixbuf_new_from_file_at_scale( psz_arturl, 72, 72, TRUE, &p_error ); + free( psz_arturl ); } - else /* else we show state-of-the art logo */ + else + /* else we show state-of-the art logo */ + if( gtk_icon_theme_get_default != NULL + && gtk_icon_theme_load_icon != NULL ) { /* First try to get an icon from the current theme. */ GtkIconTheme* p_theme = gtk_icon_theme_get_default(); pix = gtk_icon_theme_load_icon( p_theme, "vlc", 72, 0, NULL); - - if( !pix ) + } + else + { /* Load icon from share/ */ + GError *p_error = NULL; + char *psz_pixbuf; + char *psz_data = config_GetDataDir(); + if( asprintf( &psz_pixbuf, "%s/icons/48x48/vlc.png", psz_data ) >= 0 ) { - /* Load icon from share/ */ - GError *p_error = NULL; - char *psz_pixbuf; - char *psz_data = config_GetDataDir(); - if( asprintf( &psz_pixbuf, "%s/icons/48x48/vlc.png", psz_data ) >= 0 ) - { - pix = gdk_pixbuf_new_from_file( psz_pixbuf, &p_error ); - free( psz_pixbuf ); - } - free( psz_data ); + pix = gdk_pixbuf_new_from_file( psz_pixbuf, &p_error ); + free( psz_pixbuf ); } + free( psz_data ); } - free( psz_arturl ); - /* we need to replace '&' with '&' because '&' is a keyword of * notification-daemon parser */ const int i_len = strlen( psz_tmp ); -- 2.25.4