[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master 9c9e15a 03/35: Destroy xwidgets when destroying frames
From: |
Lars Ingebrigtsen |
Subject: |
master 9c9e15a 03/35: Destroy xwidgets when destroying frames |
Date: |
Sat, 6 Nov 2021 22:01:54 -0400 (EDT) |
branch: master
commit 9c9e15a0186603ef4bddd4df5f448f880636f4da
Author: Po Lu <luangruo@yahoo.com>
Commit: Lars Ingebrigtsen <larsi@gnus.org>
Destroy xwidgets when destroying frames
* src/xterm.c (x_free_frame_resources): Make sure to kill xwidget views.
* src/xwidget.c (Fmake_xwidget): Attach damage event signal.
(offscreen_damage_event): Operate on xwidgets and not individual
views.
(xwidget_init_view): Don't attach damage event signal here.
(Fdelete_xwidget_view): Destroy window correctly and stop removing
damage event signal.
(kill_frame_xwidget_views): New function.
* src/xwidget.c (kill_frame_xwidget_views): New function.
---
src/xterm.c | 4 ++++
src/xwidget.c | 52 ++++++++++++++++++++++++++++++++++++----------------
src/xwidget.h | 1 +
3 files changed, 41 insertions(+), 16 deletions(-)
diff --git a/src/xterm.c b/src/xterm.c
index b12c15c..3e8cfb8 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -12210,6 +12210,10 @@ x_free_frame_resources (struct frame *f)
xfree (f->shell_position);
#else /* !USE_X_TOOLKIT */
+#ifdef HAVE_XWIDGETS
+ kill_frame_xwidget_views (f);
+#endif
+
#ifdef USE_GTK
xg_free_frame_widgets (f);
#endif /* USE_GTK */
diff --git a/src/xwidget.c b/src/xwidget.c
index 68188eb..fe66401 100644
--- a/src/xwidget.c
+++ b/src/xwidget.c
@@ -46,6 +46,7 @@ static uint32_t xwidget_counter = 0;
#ifdef USE_GTK
static Lisp_Object x_window_to_xwv_map;
+static gboolean offscreen_damage_event (GtkWidget *, GdkEvent *, gpointer);
#endif
static struct xwidget *
@@ -193,6 +194,9 @@ Returns the newly constructed xwidget, or nil if
construction fails. */)
xw);
}
+ g_signal_connect (G_OBJECT (xw->widgetwindow_osr), "damage-event",
+ G_CALLBACK (offscreen_damage_event), xw);
+
unblock_input ();
}
#elif defined NS_IMPL_COCOA
@@ -297,15 +301,20 @@ xv_do_draw (struct xwidget_view *xw, struct xwidget *w)
It copies the bitmap from the off-screen instance. */
static gboolean
offscreen_damage_event (GtkWidget *widget, GdkEvent *event,
- gpointer xwidget_view)
+ gpointer xwidget)
{
- struct xwidget_view *xw = xwidget_view;
- struct xwidget *w = XXWIDGET (xw->model);
+ block_input ();
- if (xw->wdesc == None)
- return FALSE;
+ for (Lisp_Object tail = Vxwidget_view_list; CONSP (tail);
+ tail = XCDR (tail))
+ {
+ struct xwidget_view *view = XXWIDGET_VIEW (XCAR (tail));
+
+ if (view->wdesc && XXWIDGET (view->model) == xwidget)
+ xv_do_draw (view, XXWIDGET (view->model));
+ }
- xv_do_draw (xw, w);
+ unblock_input ();
return FALSE;
}
@@ -592,9 +601,6 @@ xwidget_init_view (struct xwidget *xww,
xv->wdesc = None;
xv->frame = s->f;
-
- g_signal_connect (G_OBJECT (xww->widgetwindow_osr), "damage-event",
- G_CALLBACK (offscreen_damage_event), xv);
#elif defined NS_IMPL_COCOA
nsxwidget_init_view (xv, xww, s, x, y);
nsxwidget_resize_view(xv, xww->width, xww->height);
@@ -1102,15 +1108,9 @@ DEFUN ("delete-xwidget-view",
if (xv->wdesc != None)
{
block_input ();
- XDestroyWindow (xv->dpy, xv->wdesc);
- /* xv->model still has signals pointing to the view. There can be
- several views. Find the matching signals and delete them all. */
- g_signal_handlers_disconnect_matched (XXWIDGET
(xv->model)->widgetwindow_osr,
- G_SIGNAL_MATCH_DATA,
- 0, 0, 0, 0, xv);
-
cairo_destroy (xv->cr_context);
cairo_surface_destroy (xv->cr_surface);
+ XDestroyWindow (xv->dpy, xv->wdesc);
Fremhash (make_fixnum (xv->wdesc), x_window_to_xwv_map);
unblock_input ();
}
@@ -1456,6 +1456,26 @@ xwidget_end_redisplay (struct window *w, struct
glyph_matrix *matrix)
}
}
+#ifdef USE_GTK
+void
+kill_frame_xwidget_views (struct frame *f)
+{
+ Lisp_Object rem = Qnil;
+
+ for (Lisp_Object tail = Vxwidget_view_list; CONSP (tail);
+ tail = XCDR (tail))
+ {
+ if (XXWIDGET_VIEW (XCAR (tail))->frame == f)
+ rem = Fcons (XCAR (tail), rem);
+ }
+
+ for (; CONSP (rem); rem = XCDR (rem))
+ {
+ Fdelete_xwidget_view (XCAR (rem));
+ }
+}
+#endif
+
/* Kill all xwidget in BUFFER. */
void
kill_buffer_xwidgets (Lisp_Object buffer)
diff --git a/src/xwidget.h b/src/xwidget.h
index 28098c0..f51921d 100644
--- a/src/xwidget.h
+++ b/src/xwidget.h
@@ -171,6 +171,7 @@ struct xwidget_view *xwidget_view_from_window (Window
wdesc);
void xwidget_expose (struct xwidget_view *xv);
extern struct xwidget *xwidget_from_id (uint32_t id);
+extern void kill_frame_xwidget_views (struct frame *f);
#else
INLINE_HEADER_BEGIN
INLINE void syms_of_xwidget (void) {}
- master updated (d69b5a9 -> 5b7ab89), Lars Ingebrigtsen, 2021/11/06
- master 61d049a 01/35: Use an X window to display xwidgets on X11, Lars Ingebrigtsen, 2021/11/06
- master 5c387ad 02/35: Enable scrolling optimization for xwidgets, Lars Ingebrigtsen, 2021/11/06
- master 9c9e15a 03/35: Destroy xwidgets when destroying frames,
Lars Ingebrigtsen <=
- master 1e16fc2 05/35: Prefer XMoveResizeWindow to XMoveWindow for resizing xwidgets, Lars Ingebrigtsen, 2021/11/06
- master b39f1f1 07/35: Implement function for sending events to widgets, Lars Ingebrigtsen, 2021/11/06
- master f52f772 04/35: Allow xwidgets to accept motion and button events, Lars Ingebrigtsen, 2021/11/06
- master c9c1b43 06/35: Use gtk_widget_queue_draw instead of xv_do_draw, Lars Ingebrigtsen, 2021/11/06
- master b48a89f 11/35: Fix special events in xwidgets, Lars Ingebrigtsen, 2021/11/06
- master 32b9df6 10/35: Fix drag on xwidget motion events, Lars Ingebrigtsen, 2021/11/06
- master 6ed7454 12/35: Add xwidget-webkit-edit-mode to make using the WebKit browser easier, Lars Ingebrigtsen, 2021/11/06
- master 8ddeebb 13/35: Allow enabling xwidget-webkit-edit-mode via a binding, Lars Ingebrigtsen, 2021/11/06
- master 74711c0 22/35: Display page titles in xwidget webkit header line, Lars Ingebrigtsen, 2021/11/06
- master eb5a079 24/35: Fix cursor for new widget views, Lars Ingebrigtsen, 2021/11/06