summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPo Lu <luangruo@yahoo.com>2021-11-22 10:42:46 +0800
committerPo Lu <luangruo@yahoo.com>2021-11-22 10:47:29 +0800
commit9324efac480df3cd78af112da2b12a0d2bd18e02 (patch)
treedf9a164eca57746fd357c296613062cec7b1f49b /src
parent536e7bf03b2ef8451fdd6b8d62db08f2bc7ebec9 (diff)
Make `xwidget-display-event' a special event as well
* doc/lispref/commands.texi (Xwidget Events): Document that `xwidget-display-event' is a special event, and that it should be handled through callbacks. * etc/NEWS: Update NEWS entry. * lisp/xwidget.el (xwidget-webkit-new-session) (xwidget-webkit-import-widget): Attach display callback. (xwidget-webkit-display-event): Call display callback instead. (xwidget-webkit-display-callback): New function. * src/keyboard.c (make_lispy_event): Store source information for XWIDGET_DISPLAY_EVENT correctly. * src/xwidget.c (store_xwidget_display_event): Store source of the display request. (webkit_ready_to_show): Store source if available. (webkit_create_cb_1): Store source if available. (kill_xwidget): Remove dead widget from internal_xwidget_list.
Diffstat (limited to 'src')
-rw-r--r--src/keyboard.c2
-rw-r--r--src/xwidget.c34
2 files changed, 26 insertions, 10 deletions
diff --git a/src/keyboard.c b/src/keyboard.c
index 982854c41e1..c98175aea0d 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -6141,7 +6141,7 @@ make_lispy_event (struct input_event *event)
return Fcons (Qxwidget_event, event->arg);
case XWIDGET_DISPLAY_EVENT:
- return list2 (Qxwidget_display_event, event->arg);
+ return Fcons (Qxwidget_display_event, event->arg);
#endif
#ifdef USE_FILE_NOTIFY
diff --git a/src/xwidget.c b/src/xwidget.c
index d88270dbe97..5da2aa1743b 100644
--- a/src/xwidget.c
+++ b/src/xwidget.c
@@ -1316,16 +1316,18 @@ store_xwidget_js_callback_event (struct xwidget *xw,
#ifdef USE_GTK
static void
-store_xwidget_display_event (struct xwidget *xw)
+store_xwidget_display_event (struct xwidget *xw,
+ struct xwidget *src)
{
struct input_event evt;
- Lisp_Object val;
+ Lisp_Object val, src_val;
XSETXWIDGET (val, xw);
+ XSETXWIDGET (src_val, src);
EVENT_INIT (evt);
evt.kind = XWIDGET_DISPLAY_EVENT;
evt.frame_or_window = Qnil;
- evt.arg = val;
+ evt.arg = list2 (val, src_val);
kbd_buffer_store_event (&evt);
}
@@ -1335,6 +1337,9 @@ webkit_ready_to_show (WebKitWebView *new_view,
{
Lisp_Object tem;
struct xwidget *xw;
+ struct xwidget *src;
+
+ src = find_xwidget_for_offscreen_window (GDK_WINDOW (user_data));
for (tem = internal_xwidget_list; CONSP (tem); tem = XCDR (tem))
{
@@ -1344,14 +1349,21 @@ webkit_ready_to_show (WebKitWebView *new_view,
if (EQ (xw->type, Qwebkit)
&& WEBKIT_WEB_VIEW (xw->widget_osr) == new_view)
- store_xwidget_display_event (xw);
+ {
+ /* The source widget was destroyed before we had a
+ chance to display the new widget. */
+ if (!src)
+ kill_xwidget (xw);
+ else
+ store_xwidget_display_event (xw, src);
+ }
}
}
}
static GtkWidget *
webkit_create_cb_1 (WebKitWebView *webview,
- struct xwidget_view *xv)
+ struct xwidget *xv)
{
Lisp_Object related;
Lisp_Object xwidget;
@@ -1369,7 +1381,8 @@ webkit_create_cb_1 (WebKitWebView *webview,
widget = XXWIDGET (xwidget)->widget_osr;
g_signal_connect (G_OBJECT (widget), "ready-to-show",
- G_CALLBACK (webkit_ready_to_show), NULL);
+ G_CALLBACK (webkit_ready_to_show),
+ gtk_widget_get_window (xv->widgetwindow_osr));
return widget;
}
@@ -1591,7 +1604,7 @@ webkit_decide_policy_cb (WebKitWebView *webView,
newview = WEBKIT_WEB_VIEW (XXWIDGET (new_xwidget)->widget_osr);
webkit_web_view_load_request (newview, request);
- store_xwidget_display_event (XXWIDGET (new_xwidget));
+ store_xwidget_display_event (XXWIDGET (new_xwidget), xw);
return TRUE;
}
case WEBKIT_POLICY_DECISION_TYPE_NAVIGATION_ACTION:
@@ -3106,6 +3119,11 @@ kill_frame_xwidget_views (struct frame *f)
static void
kill_xwidget (struct xwidget *xw)
{
+ Lisp_Object val;
+ XSETXWIDGET (val, xw);
+
+ internal_xwidget_list = Fdelq (val, internal_xwidget_list);
+ Vxwidget_list = Fcopy_sequence (internal_xwidget_list);
#ifdef USE_GTK
xw->buffer = Qnil;
@@ -3145,8 +3163,6 @@ kill_buffer_xwidgets (Lisp_Object buffer)
for (tail = Fget_buffer_xwidgets (buffer); CONSP (tail); tail = XCDR (tail))
{
xwidget = XCAR (tail);
- internal_xwidget_list = Fdelq (xwidget, internal_xwidget_list);
- Vxwidget_list = Fcopy_sequence (internal_xwidget_list);
{
CHECK_LIVE_XWIDGET (xwidget);
struct xwidget *xw = XXWIDGET (xwidget);