aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPo Lu2021-11-14 13:02:41 +0800
committerPo Lu2021-11-14 17:42:16 +0800
commit609bc1d33ad81f9f2ffa0ff34522cfdb743d2dbb (patch)
tree65024847dcebe2bcd51848ffbee23c08cbecf1b1 /src
parent06632fbaf81900143aec988a846ee18e33a85e50 (diff)
downloademacs-609bc1d33ad81f9f2ffa0ff34522cfdb743d2dbb.tar.gz
emacs-609bc1d33ad81f9f2ffa0ff34522cfdb743d2dbb.zip
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.
Diffstat (limited to 'src')
-rw-r--r--src/xwidget.c81
1 files changed, 57 insertions, 24 deletions
diff --git a/src/xwidget.c b/src/xwidget.c
index 609a231d4bb..344016ed744 100644
--- a/src/xwidget.c
+++ b/src/xwidget.c
@@ -76,6 +76,8 @@ allocate_xwidget_view (void)
76 76
77static struct xwidget_view *xwidget_view_lookup (struct xwidget *, 77static struct xwidget_view *xwidget_view_lookup (struct xwidget *,
78 struct window *); 78 struct window *);
79static void kill_xwidget (struct xwidget *);
80
79#ifdef USE_GTK 81#ifdef USE_GTK
80static void webkit_view_load_changed_cb (WebKitWebView *, 82static void webkit_view_load_changed_cb (WebKitWebView *,
81 WebKitLoadEvent, 83 WebKitLoadEvent,
@@ -2386,6 +2388,25 @@ using `xwidget-webkit-search'. */)
2386 return Qnil; 2388 return Qnil;
2387} 2389}
2388 2390
2391DEFUN ("kill-xwidget", Fkill_xwidget, Skill_xwidget,
2392 1, 1, 0,
2393 doc: /* Kill the specified XWIDGET.
2394This releases all window system resources associated with XWIDGET,
2395removes it from `xwidget-list', and detaches it from its buffer. */)
2396 (Lisp_Object xwidget)
2397{
2398 struct xwidget *xw;
2399
2400 CHECK_LIVE_XWIDGET (xwidget);
2401 xw = XXWIDGET (xwidget);
2402
2403 block_input ();
2404 kill_xwidget (xw);
2405 unblock_input ();
2406
2407 return Qnil;
2408}
2409
2389#ifdef USE_GTK 2410#ifdef USE_GTK
2390DEFUN ("xwidget-webkit-load-html", Fxwidget_webkit_load_html, 2411DEFUN ("xwidget-webkit-load-html", Fxwidget_webkit_load_html,
2391 Sxwidget_webkit_load_html, 2, 3, 0, 2412 Sxwidget_webkit_load_html, 2, 3, 0,
@@ -2468,6 +2489,7 @@ syms_of_xwidget (void)
2468#ifdef USE_GTK 2489#ifdef USE_GTK
2469 defsubr (&Sxwidget_webkit_load_html); 2490 defsubr (&Sxwidget_webkit_load_html);
2470#endif 2491#endif
2492 defsubr (&Skill_xwidget);
2471 2493
2472 DEFSYM (QCxwidget, ":xwidget"); 2494 DEFSYM (QCxwidget, ":xwidget");
2473 DEFSYM (QCtitle, ":title"); 2495 DEFSYM (QCtitle, ":title");
@@ -2708,6 +2730,40 @@ kill_frame_xwidget_views (struct frame *f)
2708} 2730}
2709#endif 2731#endif
2710 2732
2733static void
2734kill_xwidget (struct xwidget *xw)
2735{
2736#ifdef USE_GTK
2737 xw->buffer = Qnil;
2738
2739 if (xw->widget_osr && xw->widgetwindow_osr)
2740 {
2741 gtk_widget_destroy (xw->widget_osr);
2742 gtk_widget_destroy (xw->widgetwindow_osr);
2743 }
2744
2745 if (xw->find_text)
2746 xfree (xw->find_text);
2747
2748 if (!NILP (xw->script_callbacks))
2749 {
2750 for (ptrdiff_t idx = 0; idx < ASIZE (xw->script_callbacks); idx++)
2751 {
2752 Lisp_Object cb = AREF (xw->script_callbacks, idx);
2753 if (!NILP (cb))
2754 xfree (xmint_pointer (XCAR (cb)));
2755 ASET (xw->script_callbacks, idx, Qnil);
2756 }
2757 }
2758
2759 xw->widget_osr = NULL;
2760 xw->widgetwindow_osr = NULL;
2761 xw->find_text = NULL;
2762#elif defined NS_IMPL_COCOA
2763 nsxwidget_kill (xw);
2764#endif
2765}
2766
2711/* Kill all xwidget in BUFFER. */ 2767/* Kill all xwidget in BUFFER. */
2712void 2768void
2713kill_buffer_xwidgets (Lisp_Object buffer) 2769kill_buffer_xwidgets (Lisp_Object buffer)
@@ -2721,31 +2777,8 @@ kill_buffer_xwidgets (Lisp_Object buffer)
2721 { 2777 {
2722 CHECK_LIVE_XWIDGET (xwidget); 2778 CHECK_LIVE_XWIDGET (xwidget);
2723 struct xwidget *xw = XXWIDGET (xwidget); 2779 struct xwidget *xw = XXWIDGET (xwidget);
2724 xw->buffer = Qnil;
2725
2726#ifdef USE_GTK
2727 if (xw->widget_osr && xw->widgetwindow_osr)
2728 {
2729 gtk_widget_destroy (xw->widget_osr);
2730 gtk_widget_destroy (xw->widgetwindow_osr);
2731 }
2732 if (xw->find_text)
2733 xfree (xw->find_text);
2734 if (!NILP (xw->script_callbacks))
2735 for (ptrdiff_t idx = 0; idx < ASIZE (xw->script_callbacks); idx++)
2736 {
2737 Lisp_Object cb = AREF (xw->script_callbacks, idx);
2738 if (!NILP (cb))
2739 xfree (xmint_pointer (XCAR (cb)));
2740 ASET (xw->script_callbacks, idx, Qnil);
2741 }
2742 2780
2743 xw->widget_osr = NULL; 2781 kill_xwidget (xw);
2744 xw->widgetwindow_osr = NULL;
2745 xw->find_text = NULL;
2746#elif defined NS_IMPL_COCOA
2747 nsxwidget_kill (xw);
2748#endif
2749 } 2782 }
2750 } 2783 }
2751} 2784}