From ed6eecd79e7b933bccc442589ed3689a646c1256 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Valverde?= Date: Mon, 4 Apr 2016 02:25:01 +0100 Subject: [PATCH] [GTK] Check for xdg-open at run time MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove HTML_VIEWER compile-time setting. If xdg-open doesn't exist use user web browser preference as fallback. Change-Id: I3b4a4a1a36b0192d75f2c97595f37d0d88a0941e Reviewed-on: https://code.wireshark.org/review/14805 Petri-Dish: João Valverde Tested-by: Petri Dish Buildbot Reviewed-by: Peter Wu Tested-by: Peter Wu Reviewed-by: João Valverde --- CMakeLists.txt | 4 - cmake/modules/FindHtmlViewer.cmake | 51 ----------- cmakeconfig.h.in | 3 - config.h.win32 | 3 - configure.ac | 35 -------- epan/prefs.c | 4 - ui/gtk/webbrowser.c | 133 +++++++++++------------------ 7 files changed, 49 insertions(+), 184 deletions(-) delete mode 100644 cmake/modules/FindHtmlViewer.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 8b864fc4ce..fcc3ea49ad 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -658,8 +658,6 @@ if (NOT WIN32) set(M_REQUIRED TRUE) endif() -set(PACKAGELIST ${PACKAGELIST} HtmlViewer) - set(PACKAGELIST ${PACKAGELIST} LIBSSH) set(LIBSSH_OPTIONS "0.6") @@ -816,8 +814,6 @@ foreach(PACKAGE ${PACKAGELIST}) set(PACKAGE_VAR "PYTHONINTERP") elseif(${PACKAGE} STREQUAL "Gettext") set(PACKAGE_VAR "GETTEXT") - elseif(${PACKAGE} STREQUAL "HtmlViewer") - set(PACKAGE_VAR "HTML_VIEWER") elseif(${PACKAGE} STREQUAL "Perl") set(PACKAGE_VAR "PERL") else() diff --git a/cmake/modules/FindHtmlViewer.cmake b/cmake/modules/FindHtmlViewer.cmake deleted file mode 100644 index 0649693185..0000000000 --- a/cmake/modules/FindHtmlViewer.cmake +++ /dev/null @@ -1,51 +0,0 @@ -# -# - Find an html viewer program -# -# HTML_VIEWER_EXECUTABLE - the full path to perl -# HTML_VIEWER_FOUND - If false, don't attempt to use perl. - -include( FindCygwin ) - -find_program( HTML_VIEWER_EXECUTABLE - NAMES - xdg-open - mozilla - htmlview - open - $ENV{HTML_VIEWER} - PATHS - ${CYGWIN_INSTALL_PATH}/bin - /bin - /usr/bin - /usr/local/bin - /sbin -) - -if( NOT HTML_VIEWER_EXECUTABLE AND WIN32 ) - foreach( _KEY - [HKEY_CURRENT_USER\\Software\\Classes\\http\\shell\\open\\command] - [HKEY_CLASSES_ROOT\\http\\shell\\open\\command] - ) - get_filename_component( _NAME_WE ${_KEY} NAME_WE ) - get_filename_component( _PATH ${_KEY} PATH ) - string(REGEX REPLACE "\"" "" _NAME_WE ${_NAME_WE}) - string(REGEX REPLACE "\"" "" _PATH ${_PATH}) - find_program( HTML_VIEWER_EXECUTABLE "${_PATH}/${_NAME_WE}" NO_DEFAULT_PATH ) - if( HTML_VIEWER_EXECUTABLE ) - break() - endif() - endforeach() -endif() - -include( FindPackageHandleStandardArgs ) -find_package_handle_standard_args( HtmlViewer DEFAULT_MSG HTML_VIEWER_EXECUTABLE ) - -if (NOT HTML_VIEWER_EXECUTABLE) - set(HTML_VIEWER_EXECUTABLE "") - set(HTMLVIEWER_FOUND ON) -endif() - -# For compat with configure -set( HTML_VIEWER ${HTML_VIEWER_EXECUTABLE} ) - -mark_as_advanced( HTML_VIEWER_EXECUTABLE ) diff --git a/cmakeconfig.h.in b/cmakeconfig.h.in index bb62fb6737..ea674a7e5f 100644 --- a/cmakeconfig.h.in +++ b/cmakeconfig.h.in @@ -360,9 +360,6 @@ /* Define to 1 if you have the header file. */ #cmakedefine HAVE_WINSOCK2_H 1 -/* HTML viewer, e.g. mozilla */ -#cmakedefine HTML_VIEWER "${HTML_VIEWER_EXECUTABLE}" - /* Name of package */ #cmakedefine PACKAGE diff --git a/config.h.win32 b/config.h.win32 index 3273f7b8ed..9e66c4563c 100644 --- a/config.h.win32 +++ b/config.h.win32 @@ -229,9 +229,6 @@ #define VERSION_FLAVOR "@VERSION_FLAVOR@" -/* We shouldn't need this under Windows but we'll define it anyway. */ -#define HTML_VIEWER "mozilla" - /* Check for the required _MSC_VER */ #if MSC_VER_REQUIRED != _MSC_VER #define WS_TO_STRING2(x) #x diff --git a/configure.ac b/configure.ac index 50f6c85ff8..3283953fcf 100644 --- a/configure.ac +++ b/configure.ac @@ -189,41 +189,6 @@ then AC_MSG_ERROR(I couldn't find pod2html; make sure it's installed and in your path) fi -# -# Checks for programs used by Wireshark/TShark/etc. -# - -# -# XXX - this looks for various HTML viewers on the host, not the target; -# we really want to know what's available on the target, for cross-builds. -# That would probably require us to, at run time, look for xdg-open and, -# if we don't find it, look for mozilla, htmlview, etc. -# -AC_PATH_PROG(HTML_VIEWER, xdg-open) -if test "x$HTML_VIEWER" != x -then - # - # XXX - the HTML_VIEWER shell variable is the full path of xdg-open. - # Define some variable to be that, so we just run that? - # - AC_DEFINE(HAVE_XDG_OPEN, 1, [Define if we have xdg-open]) - - # - # XXX - we have to define HTML_VIEWER for the prefs.c code that - # sets the default value of the Web browser preference, even - # though that preference won't be offered. - # - AC_DEFINE_UNQUOTED(HTML_VIEWER, "xdg-open", [HTML viewer, e.g. mozilla]) -else - AC_PATH_PROG(HTML_VIEWER, htmlview) - if test "x$HTML_VIEWER" = x - then - AC_DEFINE_UNQUOTED(HTML_VIEWER, "mozilla", [HTML viewer, e.g. mozilla]) - else - AC_DEFINE_UNQUOTED(HTML_VIEWER, "htmlview", [HTML viewer, e.g. mozilla]) - fi -fi - # # Set "ac_supports_gcc_flags" if the compiler is known to support GCC-style # flags such as -pedantic, -W warning flags and -f feature flags. Currently, diff --git a/epan/prefs.c b/epan/prefs.c index c7d7a2b906..c5865baf9e 100644 --- a/epan/prefs.c +++ b/epan/prefs.c @@ -3100,11 +3100,7 @@ pre_init_prefs(void) prefs.gui_update_channel = UPDATE_CHANNEL_STABLE; prefs.gui_update_interval = 60*60*24; /* Seconds */ if (prefs.gui_webbrowser) g_free(prefs.gui_webbrowser); -#ifdef HTML_VIEWER - prefs.gui_webbrowser = g_strdup(HTML_VIEWER " %s"); -#else prefs.gui_webbrowser = g_strdup(""); -#endif if (prefs.gui_window_title) g_free(prefs.gui_window_title); prefs.gui_window_title = g_strdup(""); if (prefs.gui_prepend_window_title) g_free(prefs.gui_prepend_window_title); diff --git a/ui/gtk/webbrowser.c b/ui/gtk/webbrowser.c index 67457e44ee..c3488fdd75 100644 --- a/ui/gtk/webbrowser.c +++ b/ui/gtk/webbrowser.c @@ -126,23 +126,23 @@ /* Mac OS X - use Launch Services to start a browser */ #include #include -#elif defined(HAVE_XDG_OPEN) -/* UNIX+X11 desktop with Portland Group stuff - use xdg-open to start a browser */ #else -/* Everything else - launch the browser ourselves */ -#define MUST_LAUNCH_BROWSER_OURSELVES +/* Everything else */ +#define TRY_XDG_OPEN_THEN_BROWSER_FALLBACK #endif -#ifdef MUST_LAUNCH_BROWSER_OURSELVES +#ifdef TRY_XDG_OPEN_THEN_BROWSER_FALLBACK static gchar* strreplace (const gchar *string, const gchar *delimiter, const gchar *replacement); + +static gboolean xdg_open(const gchar *url); #endif gboolean browser_needs_pref(void) { -#ifdef MUST_LAUNCH_BROWSER_OURSELVES +#ifdef TRY_XDG_OPEN_THEN_BROWSER_FALLBACK return TRUE; #else return FALSE; @@ -192,50 +192,18 @@ browser_open_url (const gchar *url) CFRelease(url_CFURL); return (status == 0); -#elif defined(HAVE_XDG_OPEN) +#else GError *error = NULL; - const gchar *argv[3]; + gchar *browser, *argument, *cmd; + gchar **argv; gboolean retval; g_return_val_if_fail (url != NULL, FALSE); - argv[0] = "xdg-open"; - argv[1] = url; - argv[2] = NULL; - - /* - * XXX - use g_spawn_on_screen() so the browser window shows up on - * the same screen? - * - * Also, g_spawn_async() shouldn't modify argv but takes it as non-const! - */ - retval = g_spawn_async (NULL, (gchar**) argv, NULL, - G_SPAWN_SEARCH_PATH, - NULL, NULL, - NULL, &error); - - if (! retval) - { - simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK, - "%sCould not execute xdg-open: %s\n\n\"%s\"", - simple_dialog_primary_start(), simple_dialog_primary_end(), - error->message); - g_error_free (error); - } - - return retval; - -#elif defined(MUST_LAUNCH_BROWSER_OURSELVES) - - GError *error = NULL; - gchar *browser; - gchar *argument; - gchar *cmd; - gchar **argv; - gboolean retval; - - g_return_val_if_fail (url != NULL, FALSE); + if (xdg_open(url)) { + return TRUE; + } /* browser = gimp_gimprc_query ("web-browser");*/ browser = g_strdup(prefs.gui_webbrowser); @@ -349,50 +317,18 @@ filemanager_open_directory (const gchar *path) CFRelease(path_CFURL); return (status == 0); -#elif defined(HAVE_XDG_OPEN) +#else GError *error = NULL; - const gchar *argv[3]; + gchar *browser, *argument, *cmd; + gchar **argv; gboolean retval; g_return_val_if_fail (path != NULL, FALSE); - argv[0] = "xdg-open"; - argv[1] = path; - argv[2] = NULL; - - /* - * XXX - use g_spawn_on_screen() so the file managaer window shows up on - * the same screen? - * - * Also, g_spawn_async shouldn't modify argv but takes it as non-const! - */ - retval = g_spawn_async (NULL, (gchar**) argv, NULL, - G_SPAWN_SEARCH_PATH, - NULL, NULL, - NULL, &error); - - if (! retval) - { - simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK, - "%sCould not execute xdg-open: %s\n\n\"%s\"", - simple_dialog_primary_start(), simple_dialog_primary_end(), - error->message); - g_error_free (error); - } - - return retval; - -#elif defined(MUST_LAUNCH_BROWSER_OURSELVES) - - GError *error; - gchar *browser; - gchar *argument; - gchar *cmd; - gchar **argv; - gboolean retval; - - g_return_val_if_fail (path != NULL, FALSE); + if (xdg_open(path)) { + return TRUE; + } /* browser = gimp_gimprc_query ("web-browser");*/ browser = g_strdup(prefs.gui_webbrowser); @@ -466,7 +402,7 @@ filemanager_open_directory (const gchar *path) #endif } -#ifdef MUST_LAUNCH_BROWSER_OURSELVES +#ifdef TRY_XDG_OPEN_THEN_BROWSER_FALLBACK static gchar* strreplace (const gchar *string, @@ -487,7 +423,36 @@ strreplace (const gchar *string, return ret; } -#endif /* MUST_LAUNCH_BROWSER_OURSELVES */ +gboolean xdg_open(const gchar *url) { + GError *error = NULL; + gchar *argv[3]; + gboolean retval; + + argv[0] = "xdg-open"; +DIAG_OFF(cast-qual) + argv[1] = (gchar *)url; +DIAG_ON(cast-qual) + argv[2] = NULL; + + /* + * XXX - use g_spawn_on_screen() so the browser window shows up on + * the same screen? + * + * Also, g_spawn_async() shouldn't modify argv but takes it as non-const! + */ + retval = g_spawn_async (NULL, argv, NULL, + G_SPAWN_SEARCH_PATH, + NULL, NULL, + NULL, &error); + if (retval) + return TRUE; + + g_debug("Could not execute xdg-open: %s", error->message); + g_error_free(error); + return FALSE; +} + +#endif /* TRY_XDG_OPEN_THEN_BROWSER_FALLBACK */ /* browse a file relative to the data dir */