From c25400b146f7a7b3b4a29c0efa4daee9d1c49633 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9mi=20Denis-Courmont?= <remi@remlab.net>
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 <kwizart@gmail.com>"
---
 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 <vlc_playlist.h>
 #include <vlc_url.h>
 
-#include <gtk/gtk.h>
 #include <gdk-pixbuf/gdk-pixbuf.h>
 #include <libnotify/notify.h>
 
+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 '&amp;' because '&' is a keyword of
      * notification-daemon parser */
     const int i_len = strlen( psz_tmp );
-- 
2.25.4

