*** Support for gnome-moz-remote has been removed.
It has been obsolete since Emacs 25.1.
+*** New GTK-native launch mode
+For better Wayland support, the pgtk toolkit exposes a new
+'x-gtk-launch-uri' browse-url handler and uses it by default when URLs
+are browsed from a PGTK frame. For other frames, we fall back to the
+default URL launch function. This change allows us to properly raise
+browser windows under Wayland using the xdg_activation_v1 protocol.
+
** CL-Lib
+++
*** 'cl-labels' now also accepts (FUNC EXP) bindings, like 'cl-flet'.
,@(when (eq system-type 'android)
(list '(function-item :tag "Default Android browser"
:value browse-url-default-android-browser)))
+ ,@(when (eq window-system 'pgtk)
+ (list '(function-item :tag "Default GTK browser"
+ :value browse-url-default-gtk-browser)))
(function-item :tag "Default browser"
:value browse-url-default-browser)
(function :tag "Your own function")
(and (not (equal display (getenv "DISPLAY")))
display)))
+(defvar browse-url--inhibit-pgtk nil)
+
(defun browse-url-default-browser (url &rest args)
"Find a suitable browser and ask it to load URL.
Default to the URL around or before point.
'browse-url-default-haiku-browser)
((eq system-type 'android)
'browse-url-default-android-browser)
+ ((and (eq (frame-parameter nil 'window-system) 'pgtk)
+ (not browse-url--inhibit-pgtk))
+ 'browse-url-default-gtk-browser)
((browse-url-can-use-xdg-open) 'browse-url-xdg-open)
((executable-find browse-url-firefox-program) 'browse-url-firefox)
((executable-find browse-url-chromium-program) 'browse-url-chromium)
(function-put 'browse-url-default-android-browser
'browse-url-browser-kind 'external)
+(declare-function x-gtk-launch-uri "pgtkfns.c")
+
+;;;###autoload
+(defun browse-url-default-gtk-browser (url &optional new-window)
+ "Browse URL with GTK's idea of the default browser.
+If the selected frame isn't a GTK frame, fall back to
+`browse-url-default-browser'."
+ (interactive (browse-url-interactive-arg "URL: "))
+ (let ((frame (selected-frame)))
+ (if (eq (frame-parameter frame 'window-system) 'pgtk)
+ (x-gtk-launch-uri frame url)
+ (let ((browse-url--inhibit-pgtk t))
+ (browse-url-default-browser url new-window)))))
+
+(function-put 'browse-url-default-gtk-browser
+ 'browse-url-browser-kind 'external)
+
;;;###autoload
(defun browse-url-emacs (url &optional same-window)
"Ask Emacs to load URL into a buffer and show it in another window.
return NILP (enable) ? Qnil : Qt;
}
+static void
+unwind_gerror_ptr (void* data)
+{
+ GError* error = *(GError**)data;
+ if (error)
+ g_error_free (error);
+}
+
+DEFUN ("x-gtk-launch-uri", Fx_gtk_launch_uri, Sx_gtk_launch_uri, 2, 2, 0,
+ doc: /* launch URI */)
+ (Lisp_Object frame, Lisp_Object uri)
+{
+ CHECK_FRAME (frame);
+
+ if (!FRAME_LIVE_P (XFRAME (frame)) ||
+ !FRAME_PGTK_P (XFRAME (frame)) ||
+ !FRAME_GTK_OUTER_WIDGET (XFRAME (frame)))
+ error ("GTK URI launch not available for this frame");
+
+ CHECK_STRING (uri);
+ guint32 timestamp = gtk_get_current_event_time ();
+
+ GError *err = NULL;
+ specpdl_ref count = SPECPDL_INDEX ();
+
+ record_unwind_protect_ptr (unwind_gerror_ptr, &err);
+
+ gtk_show_uri_on_window (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (XFRAME (frame))),
+ SSDATA (uri),
+ timestamp,
+ &err);
+
+ if (err)
+ error ("Failed to launch URI via GTK: %s", err->message);
+
+ return unbind_to (count, Qnil);
+}
+
void
syms_of_pgtkfns (void)
{
defsubr (&Sx_close_connection);
defsubr (&Sx_display_list);
defsubr (&Sx_gtk_debug);
+ defsubr (&Sx_gtk_launch_uri);
defsubr (&Sx_show_tip);
defsubr (&Sx_hide_tip);