From: Po Lu <luangruo@yahoo.com>
To: Eli Zaretskii <eliz@gnu.org>
Cc: emacs-devel@gnu.org
Subject: Re: New function for explictly killing xwidgets
Date: Sun, 14 Nov 2021 15:16:18 +0800 [thread overview]
Message-ID: <87lf1r8awt.fsf@yahoo.com> (raw)
In-Reply-To: <83a6i7w6oj.fsf@gnu.org> (Eli Zaretskii's message of "Sun, 14 Nov 2021 09:13:48 +0200")
[-- Attachment #1: Type: text/plain, Size: 771 bytes --]
Eli Zaretskii <eliz@gnu.org> writes:
>> From: Po Lu <luangruo@yahoo.com>
>> Date: Sun, 14 Nov 2021 13:04:54 +0800
>>
>> * doc/lispref/display.texi (Xwidgets): Document changes.
>
> This should say "Document 'kill-xwidget'."
>
>> +DEFUN ("kill-xwidget", Fkill_xwidget, Skill_xwidget,
>> + 1, 1, 0,
>> + doc: /* Kill live xwidget XWIDGET.
>
> One of the two "xwidget"s is redundant. Our style in these cases is
> like this:
>
> Kill the specified XWIDGET.
>
>> + if (!NILP (xw->script_callbacks))
>> + for (ptrdiff_t idx = 0; idx < ASIZE (xw->script_callbacks); idx++)
>
> It is better to use braces around the for-loop, although strictly
> speaking they aren't needed here. But the code reads easier with
> them.
Thanks, how does this look to you?
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Add-kill-xwidget.patch --]
[-- Type: text/x-patch, Size: 5031 bytes --]
From fc2282c058c58927afff78f42609a73583b4ddab Mon Sep 17 00:00:00 2001
From: Po Lu <luangruo@yahoo.com>
Date: Sun, 14 Nov 2021 13:02:41 +0800
Subject: [PATCH] Add `kill-xwidget'
* doc/lispref/display.texi (Xwidgets): Document 'kill-xwidget'.
* src/xwidget.c (kill_xwidget, Fkill_xwidget): New function.
(syms_of_xwidget): Define new subr.
(kill_buffer_xwidgets): Use `kill_xwidget' instead.
---
doc/lispref/display.texi | 14 +++++--
src/xwidget.c | 81 ++++++++++++++++++++++++++++------------
2 files changed, 67 insertions(+), 28 deletions(-)
diff --git a/doc/lispref/display.texi b/doc/lispref/display.texi
index a8a7837a4a..3ab29dc591 100644
--- a/doc/lispref/display.texi
+++ b/doc/lispref/display.texi
@@ -6806,10 +6806,11 @@ Xwidgets
subprocesses with.
The xwidget that is returned will be killed alongside its buffer
-(@pxref{Killing Buffers}). Once it is killed, the xwidget may
-continue to exist as a Lisp object and act as a @code{display}
-property until all references to it are gone, but most actions that
-can be performed on live xwidgets will no longer be available.
+(@pxref{Killing Buffers}). You can also kill it using
+@code{xwidget-kill}. Once it is killed, the xwidget may continue to
+exist as a Lisp object and act as a @code{display} property until all
+references to it are gone, but most actions that can be performed on
+live xwidgets will no longer be available.
@end defun
@defun xwidgetp object
@@ -6822,6 +6823,11 @@ Xwidgets
hasn't been killed, and @code{nil} otherwise.
@end defun
+@defun kill-xwidget xwidget
+This function kills @var{xwidget}, by removing it from its buffer and
+releasing window system resources it holds.
+@end defun
+
@defun xwidget-plist xwidget
This function returns the property list of @var{xwidget}.
@end defun
diff --git a/src/xwidget.c b/src/xwidget.c
index 609a231d4b..344016ed74 100644
--- a/src/xwidget.c
+++ b/src/xwidget.c
@@ -76,6 +76,8 @@ #define XSETXWIDGET_VIEW(a, b) XSETPSEUDOVECTOR (a, b, PVEC_XWIDGET_VIEW)
static struct xwidget_view *xwidget_view_lookup (struct xwidget *,
struct window *);
+static void kill_xwidget (struct xwidget *);
+
#ifdef USE_GTK
static void webkit_view_load_changed_cb (WebKitWebView *,
WebKitLoadEvent,
@@ -2386,6 +2388,25 @@ DEFUN ("xwidget-webkit-finish-search", Fxwidget_webkit_finish_search,
return Qnil;
}
+DEFUN ("kill-xwidget", Fkill_xwidget, Skill_xwidget,
+ 1, 1, 0,
+ doc: /* Kill the specified XWIDGET.
+This releases all window system resources associated with XWIDGET,
+removes it from `xwidget-list', and detaches it from its buffer. */)
+ (Lisp_Object xwidget)
+{
+ struct xwidget *xw;
+
+ CHECK_LIVE_XWIDGET (xwidget);
+ xw = XXWIDGET (xwidget);
+
+ block_input ();
+ kill_xwidget (xw);
+ unblock_input ();
+
+ return Qnil;
+}
+
#ifdef USE_GTK
DEFUN ("xwidget-webkit-load-html", Fxwidget_webkit_load_html,
Sxwidget_webkit_load_html, 2, 3, 0,
@@ -2468,6 +2489,7 @@ syms_of_xwidget (void)
#ifdef USE_GTK
defsubr (&Sxwidget_webkit_load_html);
#endif
+ defsubr (&Skill_xwidget);
DEFSYM (QCxwidget, ":xwidget");
DEFSYM (QCtitle, ":title");
@@ -2708,6 +2730,40 @@ kill_frame_xwidget_views (struct frame *f)
}
#endif
+static void
+kill_xwidget (struct xwidget *xw)
+{
+#ifdef USE_GTK
+ xw->buffer = Qnil;
+
+ if (xw->widget_osr && xw->widgetwindow_osr)
+ {
+ gtk_widget_destroy (xw->widget_osr);
+ gtk_widget_destroy (xw->widgetwindow_osr);
+ }
+
+ if (xw->find_text)
+ xfree (xw->find_text);
+
+ if (!NILP (xw->script_callbacks))
+ {
+ for (ptrdiff_t idx = 0; idx < ASIZE (xw->script_callbacks); idx++)
+ {
+ Lisp_Object cb = AREF (xw->script_callbacks, idx);
+ if (!NILP (cb))
+ xfree (xmint_pointer (XCAR (cb)));
+ ASET (xw->script_callbacks, idx, Qnil);
+ }
+ }
+
+ xw->widget_osr = NULL;
+ xw->widgetwindow_osr = NULL;
+ xw->find_text = NULL;
+#elif defined NS_IMPL_COCOA
+ nsxwidget_kill (xw);
+#endif
+}
+
/* Kill all xwidget in BUFFER. */
void
kill_buffer_xwidgets (Lisp_Object buffer)
@@ -2721,31 +2777,8 @@ kill_buffer_xwidgets (Lisp_Object buffer)
{
CHECK_LIVE_XWIDGET (xwidget);
struct xwidget *xw = XXWIDGET (xwidget);
- xw->buffer = Qnil;
-
-#ifdef USE_GTK
- if (xw->widget_osr && xw->widgetwindow_osr)
- {
- gtk_widget_destroy (xw->widget_osr);
- gtk_widget_destroy (xw->widgetwindow_osr);
- }
- if (xw->find_text)
- xfree (xw->find_text);
- if (!NILP (xw->script_callbacks))
- for (ptrdiff_t idx = 0; idx < ASIZE (xw->script_callbacks); idx++)
- {
- Lisp_Object cb = AREF (xw->script_callbacks, idx);
- if (!NILP (cb))
- xfree (xmint_pointer (XCAR (cb)));
- ASET (xw->script_callbacks, idx, Qnil);
- }
- xw->widget_osr = NULL;
- xw->widgetwindow_osr = NULL;
- xw->find_text = NULL;
-#elif defined NS_IMPL_COCOA
- nsxwidget_kill (xw);
-#endif
+ kill_xwidget (xw);
}
}
}
--
2.31.1
next prev parent reply other threads:[~2021-11-14 7:16 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <8735nz9vk9.fsf.ref@yahoo.com>
2021-11-14 5:04 ` New function for explictly killing xwidgets Po Lu
2021-11-14 5:06 ` Po Lu
2021-11-14 7:13 ` Eli Zaretskii
2021-11-14 7:16 ` Po Lu [this message]
2021-11-14 7:57 ` Eli Zaretskii
2021-11-14 9:42 ` Po Lu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87lf1r8awt.fsf@yahoo.com \
--to=luangruo@yahoo.com \
--cc=eliz@gnu.org \
--cc=emacs-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).