From 2953778a4c0e61d8fe49c7a6d707add8a9eb0634 Mon Sep 17 00:00:00 2001 From: Luca Bacci Date: Thu, 9 Aug 2018 10:26:44 +0200 Subject: [PATCH] port-to-gtk3: Use Gdk::AppLaunchContext to launch yelp (#7) gdk_spawn_command_line_on_screen() is not present in Gtk3. The documentation from Gtkmm 2.24 states [1]: gdk_spawn_command_line_on_screen has been deprecated since version 2.24 and should not be used in newly-written code. This function is being removed in 3.0. Use either g_spawn_command_line_sync(), g_spawn_command_line_async() or GdkAppLaunchContext instead. g_spawn_command_line_sync() and g_spawn_command_line_async() are screen / display agnostic, as such we would loose functionality. There is a workaround, which involves setting the DISPLAY environment variable [2], but it's a weak solution (and I don't know if it works on backends other than X11). GdkAppLaunchContext is an implementation of GIO's GAppLaunchContext that handles launching an application in a graphical context [3]. Therefore use GdkAppLaunchContext and GIO's GAppInfo. GdkAppLaunchContext was introduced in Gtk2 version 2.14. The C++ wrapper Gdk::AppLaunchContext was introduced only in Gtkmm3 version 3.4 [4]. Bump the minimum required version of Gtkmm to 3.4.0 for this requirement. GAppInfo was introduced in GLib version 2.16. The C++ wrapper Gio::AppInfo was introduced in Giomm version 2.16. Note that the minimum required version for glibmm is already 2.32. [1] GDK 2 Reference Manual, GdkScreen, gdk_spawn_on_screen() https://developer.gnome.org/gdk2/2.24/GdkScreen.html#gdk-spawn-on-screen [2] Migrating from GTK+ 2.x to GTK+ 3 - "Use GIO for launching applications" https://developer.gnome.org/gtk3/stable/gtk-migrating-2-to-3.html#id-1.6.3.3.7 [3] GDK 3 Reference Manual - "Application launching" https://developer.gnome.org/gdk3/stable/gdk3-Application-launching.html [4] Gtkmm 3.4 Gdk::AppLaunchContext Class Reference, Detailed Description https://developer.gnome.org/gtkmm/3.4/classGdk_1_1AppLaunchContext.html#details Closes #7 - Port to Gtk3 --- configure.ac | 2 +- src/Win_GParted.cc | 50 ++++++++++++++++++++++++++++++---------------- 2 files changed, 34 insertions(+), 18 deletions(-) diff --git a/configure.ac b/configure.ac index 9c11ab79..8cad5e8e 100644 --- a/configure.ac +++ b/configure.ac @@ -199,7 +199,7 @@ AC_SUBST([GTHREAD_LIBS]) AC_SUBST([GTHREAD_CFLAGS]) dnl GTKMM -PKG_CHECK_MODULES([GTKMM], [gtkmm-3.0 >= 3.0.0]) +PKG_CHECK_MODULES([GTKMM], [gtkmm-3.0 >= 3.4.0]) AC_SUBST([GTKMM_LIBS]) AC_SUBST([GTKMM_CFLAGS]) diff --git a/src/Win_GParted.cc b/src/Win_GParted.cc index a30329ba..ea29baa7 100644 --- a/src/Win_GParted.cc +++ b/src/Win_GParted.cc @@ -1748,28 +1748,44 @@ void Win_GParted::show_help_dialog( const Glib::ustring & filename /* E.g., gpar uri = uri + "?" + link_id ; } - gscreen = gdk_screen_get_default() ; - + gscreen = get_window()->get_screen()->gobj(); gtk_show_uri( gscreen, uri .c_str(), gtk_get_current_event_time(), &error ) ; if ( error != NULL ) { //Try opening yelp application directly - g_clear_error( &error ); // Clear error from trying to open gparted help manual above (gtk_show_uri). - Glib::ustring command = "yelp " + uri ; - gdk_spawn_command_line_on_screen( gscreen, command .c_str(), &error ) ; - } - if ( error != NULL ) - { - Gtk::MessageDialog dialog( *this - , _( "Unable to open GParted Manual help file" ) - , false - , Gtk::MESSAGE_ERROR - , Gtk::BUTTONS_OK - , true - ) ; - dialog .set_secondary_text( error ->message ) ; - dialog .run() ; + Glib::RefPtr yelp + = Gio::AppInfo::create_from_commandline("yelp", "", Gio::APP_INFO_CREATE_SUPPORTS_URIS); + + Glib::RefPtr context + = get_window()->get_display()->get_app_launch_context(); + + context->set_timestamp(gtk_get_current_event_time()); + + bool launched; + try + { + launched = yelp->launch_uris(std::vector(1, uri), context); + } + catch (Glib::Error& e) + { + std::cerr << e.what() << std::endl; + launched = false; + } + + if (!launched) + { + Gtk::MessageDialog dialog(*this, + _( "Unable to open GParted Manual help file" ), + false, + Gtk::MESSAGE_ERROR, + Gtk::BUTTONS_OK, + true); + dialog.set_secondary_text(error->message); + dialog.run(); + } + + g_clear_error(&error); } }