aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPo Lu2021-12-31 09:27:12 +0800
committerPo Lu2021-12-31 09:28:12 +0800
commit77f17649d81b2fbe8917264e6b253a95a3f2eea1 (patch)
tree8bef4d94a3948251430169d44356cfb49a343396 /src
parentcc43606b552b66154cc243186e252ff3933e4206 (diff)
downloademacs-77f17649d81b2fbe8917264e6b253a95a3f2eea1.tar.gz
emacs-77f17649d81b2fbe8917264e6b253a95a3f2eea1.zip
Restore original xwidget embedder after performing a lispy event
* src/xwidget.c (Fxwidget_perform_lispy_event): Restore original embedder after performing event. (Fdelete_xwidget_view): Block input around non-reentrant section.
Diffstat (limited to 'src')
-rw-r--r--src/xwidget.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/src/xwidget.c b/src/xwidget.c
index 025275f1a05..05997bb9d5e 100644
--- a/src/xwidget.c
+++ b/src/xwidget.c
@@ -461,10 +461,12 @@ selected frame is not an X-Windows frame. */)
461 if (!f) 461 if (!f)
462 return Qnil; 462 return Qnil;
463 463
464 block_input ();
464 osw = gtk_widget_get_window (xw->widgetwindow_osr); 465 osw = gtk_widget_get_window (xw->widgetwindow_osr);
465 embedder = gtk_widget_get_window (FRAME_GTK_OUTER_WIDGET (f)); 466 embedder = gtk_widget_get_window (FRAME_GTK_OUTER_WIDGET (f));
466 467
467 gdk_offscreen_window_set_embedder (osw, embedder); 468 gdk_offscreen_window_set_embedder (osw, embedder);
469 unblock_input ();
468#endif 470#endif
469 widget = gtk_window_get_focus (GTK_WINDOW (xw->widgetwindow_osr)); 471 widget = gtk_window_get_focus (GTK_WINDOW (xw->widgetwindow_osr));
470 472
@@ -540,7 +542,17 @@ selected frame is not an X-Windows frame. */)
540 } 542 }
541 543
542 if (character == -1 && keycode == -1) 544 if (character == -1 && keycode == -1)
543 return Qnil; 545 {
546#ifdef HAVE_XINPUT2
547 block_input ();
548 if (xw->embedder_view)
549 record_osr_embedder (xw->embedder_view);
550 else
551 gdk_offscreen_window_set_embedder (osw, NULL);
552 unblock_input ();
553#endif
554 return Qnil;
555 }
544 556
545 block_input (); 557 block_input ();
546 xg_event = gdk_event_new (GDK_KEY_PRESS); 558 xg_event = gdk_event_new (GDK_KEY_PRESS);
@@ -584,6 +596,13 @@ selected frame is not an X-Windows frame. */)
584 xg_event->type = GDK_KEY_RELEASE; 596 xg_event->type = GDK_KEY_RELEASE;
585 gtk_main_do_event (xg_event); 597 gtk_main_do_event (xg_event);
586 gdk_event_free (xg_event); 598 gdk_event_free (xg_event);
599
600#ifdef HAVE_XINPUT2
601 if (xw->embedder_view)
602 record_osr_embedder (xw->embedder_view);
603 else
604 gdk_offscreen_window_set_embedder (osw, NULL);
605#endif
587 unblock_input (); 606 unblock_input ();
588#endif 607#endif
589 608
@@ -2612,18 +2631,18 @@ DEFUN ("delete-xwidget-view",
2612{ 2631{
2613 CHECK_XWIDGET_VIEW (xwidget_view); 2632 CHECK_XWIDGET_VIEW (xwidget_view);
2614 struct xwidget_view *xv = XXWIDGET_VIEW (xwidget_view); 2633 struct xwidget_view *xv = XXWIDGET_VIEW (xwidget_view);
2634
2635 block_input ();
2615#ifdef USE_GTK 2636#ifdef USE_GTK
2616 struct xwidget *xw = XXWIDGET (xv->model); 2637 struct xwidget *xw = XXWIDGET (xv->model);
2617 GdkWindow *w; 2638 GdkWindow *w;
2618#ifdef HAVE_X_WINDOWS 2639#ifdef HAVE_X_WINDOWS
2619 if (xv->wdesc != None) 2640 if (xv->wdesc != None)
2620 { 2641 {
2621 block_input ();
2622 cairo_destroy (xv->cr_context); 2642 cairo_destroy (xv->cr_context);
2623 cairo_surface_destroy (xv->cr_surface); 2643 cairo_surface_destroy (xv->cr_surface);
2624 XDestroyWindow (xv->dpy, xv->wdesc); 2644 XDestroyWindow (xv->dpy, xv->wdesc);
2625 Fremhash (make_fixnum (xv->wdesc), x_window_to_xwv_map); 2645 Fremhash (make_fixnum (xv->wdesc), x_window_to_xwv_map);
2626 unblock_input ();
2627 } 2646 }
2628#else 2647#else
2629 gtk_widget_destroy (xv->widget); 2648 gtk_widget_destroy (xv->widget);
@@ -2644,6 +2663,7 @@ DEFUN ("delete-xwidget-view",
2644 2663
2645 internal_xwidget_view_list = Fdelq (xwidget_view, internal_xwidget_view_list); 2664 internal_xwidget_view_list = Fdelq (xwidget_view, internal_xwidget_view_list);
2646 Vxwidget_view_list = Fcopy_sequence (internal_xwidget_view_list); 2665 Vxwidget_view_list = Fcopy_sequence (internal_xwidget_view_list);
2666 unblock_input ();
2647 return Qnil; 2667 return Qnil;
2648} 2668}
2649 2669