mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-24 22:40:51 -08:00
Expose xwidget navigation history to Lisp code
* doc/lispref/display.texi (Xwidgets): Document changes. * etc/NEWS: Announce new function. * src/xwidget.c (Fxwidget_webkit_back_forward_list): New function. (syms_of_xwidget): Define new subr.
This commit is contained in:
parent
609bc1d33a
commit
c3f53d2604
3 changed files with 133 additions and 0 deletions
|
|
@ -6971,6 +6971,39 @@ the absolute location of the web resources referenced by @var{text},
|
|||
to be used for resolving relative links in @var{text}.
|
||||
@end defun
|
||||
|
||||
@defun xwidget-webkit-goto-history xwidget rel-pos
|
||||
Make @var{xwidget}, a WebKit widget, load the @var{rel-pos}th element
|
||||
in its navigation history.
|
||||
|
||||
If @var{rel-pos} is zero, the current page will be reloaded instead.
|
||||
@end defun
|
||||
|
||||
@defun xwidget-webkit-back-forward-list xwidget &optional limit
|
||||
Return the navigation history of @var{xwidget}, up to @var{limit}
|
||||
items in each direction. If not specified, @var{limit} defaults to
|
||||
50.
|
||||
|
||||
The returned value is a list of the form @w{@code{(@var{back}
|
||||
@var{here} @var{forward})}}, where @var{here} is the current
|
||||
navigation item, while @var{back} is a list of items containing the
|
||||
items recorded by WebKit before the current navigation item, and
|
||||
@var{forward} is a list of items recorded after the current navigation
|
||||
item. @var{back}, @var{here} and @var{forward} can all be @code{nil}.
|
||||
|
||||
When @var{here} is @code{nil}, it means that no items have been
|
||||
recorded yet; if @var{back} or @var{forward} are @code{nil}, it means
|
||||
that there is no history recorded before or after the current item
|
||||
respectively.
|
||||
|
||||
Navigation items are themselves lists of the form @w{@code{(@var{idx}
|
||||
@var{title} @var{uri})}}. In these lists, @var{idx} is an index that
|
||||
can be passed to @code{xwidget-webkit-goto-history}, @var{title} is
|
||||
the human-readable title of the item, and @var{uri} is the URI of the
|
||||
item. The user should normally have no reason to load @var{uri}
|
||||
manually to reach a specific history item. Instead, @var{idx} should
|
||||
be passed as an index to @code{xwidget-webkit-goto-history}.
|
||||
@end defun
|
||||
|
||||
@node Buttons
|
||||
@section Buttons
|
||||
@cindex buttons in buffers
|
||||
|
|
|
|||
5
etc/NEWS
5
etc/NEWS
|
|
@ -781,6 +781,11 @@ markup, and passing the URI of the file as an argument to
|
|||
Some new functions, such as 'xwidget-webkit-search', have been added
|
||||
for performing searches on WebKit xwidgets.
|
||||
|
||||
+++
|
||||
*** New function 'xwidget-webkit-back-forward-list'.
|
||||
This function is used to obtain the history of page-loads in a given
|
||||
WebKit xwidget.
|
||||
|
||||
+++
|
||||
*** 'load-changed' xwidget events are now more detailed.
|
||||
In particular, they can now have different arguments based on the
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
|
|||
#include <config.h>
|
||||
|
||||
#include "buffer.h"
|
||||
#include "coding.h"
|
||||
#include "xwidget.h"
|
||||
|
||||
#include "lisp.h"
|
||||
|
|
@ -2444,6 +2445,99 @@ to "about:blank". */)
|
|||
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
DEFUN ("xwidget-webkit-back-forward-list", Fxwidget_webkit_back_forward_list,
|
||||
Sxwidget_webkit_back_forward_list, 1, 2, 0,
|
||||
doc: /* Return the navigation history of XWIDGET, a WebKit xwidget.
|
||||
|
||||
Return the history as a list of the form (BACK HERE FORWARD), where
|
||||
HERE is the current navigation item, while BACK and FORWARD are lists
|
||||
of history items of the form (IDX TITLE URI). Here, IDX is an index
|
||||
that can be passed to `xwidget-webkit-goto-history', TITLE is a string
|
||||
containing the human-readable title of the history item, and URI is
|
||||
the URI of the history item.
|
||||
|
||||
BACK, HERE, and FORWARD can all be nil depending on the state of the
|
||||
navigation history.
|
||||
|
||||
BACK and FORWARD will each not contain more elements than LIMIT. If
|
||||
LIMIT is not specified or nil, it is treated as `50'. */)
|
||||
(Lisp_Object xwidget, Lisp_Object limit)
|
||||
{
|
||||
struct xwidget *xw;
|
||||
Lisp_Object back, here, forward;
|
||||
WebKitWebView *webview;
|
||||
WebKitBackForwardList *list;
|
||||
WebKitBackForwardListItem *item;
|
||||
GList *parent, *tem;
|
||||
int i;
|
||||
unsigned int lim;
|
||||
Lisp_Object title, uri;
|
||||
const gchar *item_title, *item_uri;
|
||||
|
||||
back = Qnil;
|
||||
here = Qnil;
|
||||
forward = Qnil;
|
||||
|
||||
if (NILP (limit))
|
||||
limit = make_fixnum (50);
|
||||
else
|
||||
CHECK_FIXNAT (limit);
|
||||
|
||||
CHECK_LIVE_XWIDGET (xwidget);
|
||||
xw = XXWIDGET (xwidget);
|
||||
|
||||
webview = WEBKIT_WEB_VIEW (xw->widget_osr);
|
||||
list = webkit_web_view_get_back_forward_list (webview);
|
||||
item = webkit_back_forward_list_get_current_item (list);
|
||||
lim = XFIXNAT (limit);
|
||||
|
||||
if (item)
|
||||
{
|
||||
item_title = webkit_back_forward_list_item_get_title (item);
|
||||
item_uri = webkit_back_forward_list_item_get_uri (item);
|
||||
here = list3 (make_fixnum (0),
|
||||
build_string_from_utf8 (item_title ? item_title : ""),
|
||||
build_string_from_utf8 (item_uri ? item_uri : ""));
|
||||
}
|
||||
parent = webkit_back_forward_list_get_back_list_with_limit (list, lim);
|
||||
|
||||
if (parent)
|
||||
{
|
||||
for (i = 1, tem = parent; parent; parent = parent->next, ++i)
|
||||
{
|
||||
item = tem->data;
|
||||
item_title = webkit_back_forward_list_item_get_title (item);
|
||||
item_uri = webkit_back_forward_list_item_get_uri (item);
|
||||
title = build_string_from_utf8 (item_title ? item_title : "");
|
||||
uri = build_string_from_utf8 (item_uri ? item_uri : "");
|
||||
back = Fcons (list3 (make_fixnum (-i), title, uri), back);
|
||||
}
|
||||
}
|
||||
|
||||
back = Fnreverse (back);
|
||||
g_list_free (parent);
|
||||
|
||||
parent = webkit_back_forward_list_get_forward_list_with_limit (list, lim);
|
||||
|
||||
if (parent)
|
||||
{
|
||||
for (i = 1, tem = parent; parent; parent = parent->next, ++i)
|
||||
{
|
||||
item = tem->data;
|
||||
item_title = webkit_back_forward_list_item_get_title (item);
|
||||
item_uri = webkit_back_forward_list_item_get_uri (item);
|
||||
title = build_string_from_utf8 (item_title ? item_title : "");
|
||||
uri = build_string_from_utf8 (item_uri ? item_uri : "");
|
||||
forward = Fcons (list3 (make_fixnum (i), title, uri), forward);
|
||||
}
|
||||
}
|
||||
|
||||
forward = Fnreverse (forward);
|
||||
g_list_free (parent);
|
||||
|
||||
return list3 (back, here, forward);
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
|
|
@ -2488,6 +2582,7 @@ syms_of_xwidget (void)
|
|||
defsubr (&Sset_xwidget_buffer);
|
||||
#ifdef USE_GTK
|
||||
defsubr (&Sxwidget_webkit_load_html);
|
||||
defsubr (&Sxwidget_webkit_back_forward_list);
|
||||
#endif
|
||||
defsubr (&Skill_xwidget);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue