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
This commit is contained in:
parent
202e6e9034
commit
2953778a4c
|
@ -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])
|
||||
|
||||
|
|
|
@ -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<Gio::AppInfo> yelp
|
||||
= Gio::AppInfo::create_from_commandline("yelp", "", Gio::APP_INFO_CREATE_SUPPORTS_URIS);
|
||||
|
||||
Glib::RefPtr<Gdk::AppLaunchContext> 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<std::string>(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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue