emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 609bc1d: Add `kill-xwidget'


From: Po Lu
Subject: master 609bc1d: Add `kill-xwidget'
Date: Sun, 14 Nov 2021 04:42:31 -0500 (EST)

branch: master
commit 609bc1d33ad81f9f2ffa0ff34522cfdb743d2dbb
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    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 a8a7837..3ab29dc 100644
--- a/doc/lispref/display.texi
+++ b/doc/lispref/display.texi
@@ -6806,10 +6806,11 @@ widget that the newly created widget should share 
settings and
 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 @@ This function returns @code{t} if @var{object} is an 
xwidget that
 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 609a231..344016e 100644
--- a/src/xwidget.c
+++ b/src/xwidget.c
@@ -76,6 +76,8 @@ allocate_xwidget_view (void)
 
 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 @@ using `xwidget-webkit-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);
       }
     }
 }



reply via email to

[Prev in Thread] Current Thread [Next in Thread]