aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPo Lu2021-11-22 10:42:46 +0800
committerPo Lu2021-11-22 10:47:29 +0800
commit9324efac480df3cd78af112da2b12a0d2bd18e02 (patch)
treedf9a164eca57746fd357c296613062cec7b1f49b /src
parent536e7bf03b2ef8451fdd6b8d62db08f2bc7ebec9 (diff)
downloademacs-9324efac480df3cd78af112da2b12a0d2bd18e02.tar.gz
emacs-9324efac480df3cd78af112da2b12a0d2bd18e02.zip
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)
6141 return Fcons (Qxwidget_event, event->arg); 6141 return Fcons (Qxwidget_event, event->arg);
6142 6142
6143 case XWIDGET_DISPLAY_EVENT: 6143 case XWIDGET_DISPLAY_EVENT:
6144 return list2 (Qxwidget_display_event, event->arg); 6144 return Fcons (Qxwidget_display_event, event->arg);
6145#endif 6145#endif
6146 6146
6147#ifdef USE_FILE_NOTIFY 6147#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,
1316 1316
1317#ifdef USE_GTK 1317#ifdef USE_GTK
1318static void 1318static void
1319store_xwidget_display_event (struct xwidget *xw) 1319store_xwidget_display_event (struct xwidget *xw,
1320 struct xwidget *src)
1320{ 1321{
1321 struct input_event evt; 1322 struct input_event evt;
1322 Lisp_Object val; 1323 Lisp_Object val, src_val;
1323 1324
1324 XSETXWIDGET (val, xw); 1325 XSETXWIDGET (val, xw);
1326 XSETXWIDGET (src_val, src);
1325 EVENT_INIT (evt); 1327 EVENT_INIT (evt);
1326 evt.kind = XWIDGET_DISPLAY_EVENT; 1328 evt.kind = XWIDGET_DISPLAY_EVENT;
1327 evt.frame_or_window = Qnil; 1329 evt.frame_or_window = Qnil;
1328 evt.arg = val; 1330 evt.arg = list2 (val, src_val);
1329 kbd_buffer_store_event (&evt); 1331 kbd_buffer_store_event (&evt);
1330} 1332}
1331 1333
@@ -1335,6 +1337,9 @@ webkit_ready_to_show (WebKitWebView *new_view,
1335{ 1337{
1336 Lisp_Object tem; 1338 Lisp_Object tem;
1337 struct xwidget *xw; 1339 struct xwidget *xw;
1340 struct xwidget *src;
1341
1342 src = find_xwidget_for_offscreen_window (GDK_WINDOW (user_data));
1338 1343
1339 for (tem = internal_xwidget_list; CONSP (tem); tem = XCDR (tem)) 1344 for (tem = internal_xwidget_list; CONSP (tem); tem = XCDR (tem))
1340 { 1345 {
@@ -1344,14 +1349,21 @@ webkit_ready_to_show (WebKitWebView *new_view,
1344 1349
1345 if (EQ (xw->type, Qwebkit) 1350 if (EQ (xw->type, Qwebkit)
1346 && WEBKIT_WEB_VIEW (xw->widget_osr) == new_view) 1351 && WEBKIT_WEB_VIEW (xw->widget_osr) == new_view)
1347 store_xwidget_display_event (xw); 1352 {
1353 /* The source widget was destroyed before we had a
1354 chance to display the new widget. */
1355 if (!src)
1356 kill_xwidget (xw);
1357 else
1358 store_xwidget_display_event (xw, src);
1359 }
1348 } 1360 }
1349 } 1361 }
1350} 1362}
1351 1363
1352static GtkWidget * 1364static GtkWidget *
1353webkit_create_cb_1 (WebKitWebView *webview, 1365webkit_create_cb_1 (WebKitWebView *webview,
1354 struct xwidget_view *xv) 1366 struct xwidget *xv)
1355{ 1367{
1356 Lisp_Object related; 1368 Lisp_Object related;
1357 Lisp_Object xwidget; 1369 Lisp_Object xwidget;
@@ -1369,7 +1381,8 @@ webkit_create_cb_1 (WebKitWebView *webview,
1369 widget = XXWIDGET (xwidget)->widget_osr; 1381 widget = XXWIDGET (xwidget)->widget_osr;
1370 1382
1371 g_signal_connect (G_OBJECT (widget), "ready-to-show", 1383 g_signal_connect (G_OBJECT (widget), "ready-to-show",
1372 G_CALLBACK (webkit_ready_to_show), NULL); 1384 G_CALLBACK (webkit_ready_to_show),
1385 gtk_widget_get_window (xv->widgetwindow_osr));
1373 1386
1374 return widget; 1387 return widget;
1375} 1388}
@@ -1591,7 +1604,7 @@ webkit_decide_policy_cb (WebKitWebView *webView,
1591 newview = WEBKIT_WEB_VIEW (XXWIDGET (new_xwidget)->widget_osr); 1604 newview = WEBKIT_WEB_VIEW (XXWIDGET (new_xwidget)->widget_osr);
1592 webkit_web_view_load_request (newview, request); 1605 webkit_web_view_load_request (newview, request);
1593 1606
1594 store_xwidget_display_event (XXWIDGET (new_xwidget)); 1607 store_xwidget_display_event (XXWIDGET (new_xwidget), xw);
1595 return TRUE; 1608 return TRUE;
1596 } 1609 }
1597 case WEBKIT_POLICY_DECISION_TYPE_NAVIGATION_ACTION: 1610 case WEBKIT_POLICY_DECISION_TYPE_NAVIGATION_ACTION:
@@ -3106,6 +3119,11 @@ kill_frame_xwidget_views (struct frame *f)
3106static void 3119static void
3107kill_xwidget (struct xwidget *xw) 3120kill_xwidget (struct xwidget *xw)
3108{ 3121{
3122 Lisp_Object val;
3123 XSETXWIDGET (val, xw);
3124
3125 internal_xwidget_list = Fdelq (val, internal_xwidget_list);
3126 Vxwidget_list = Fcopy_sequence (internal_xwidget_list);
3109#ifdef USE_GTK 3127#ifdef USE_GTK
3110 xw->buffer = Qnil; 3128 xw->buffer = Qnil;
3111 3129
@@ -3145,8 +3163,6 @@ kill_buffer_xwidgets (Lisp_Object buffer)
3145 for (tail = Fget_buffer_xwidgets (buffer); CONSP (tail); tail = XCDR (tail)) 3163 for (tail = Fget_buffer_xwidgets (buffer); CONSP (tail); tail = XCDR (tail))
3146 { 3164 {
3147 xwidget = XCAR (tail); 3165 xwidget = XCAR (tail);
3148 internal_xwidget_list = Fdelq (xwidget, internal_xwidget_list);
3149 Vxwidget_list = Fcopy_sequence (internal_xwidget_list);
3150 { 3166 {
3151 CHECK_LIVE_XWIDGET (xwidget); 3167 CHECK_LIVE_XWIDGET (xwidget);
3152 struct xwidget *xw = XXWIDGET (xwidget); 3168 struct xwidget *xw = XXWIDGET (xwidget);