diff options
| author | Po Lu | 2021-12-31 09:27:12 +0800 |
|---|---|---|
| committer | Po Lu | 2021-12-31 09:28:12 +0800 |
| commit | 77f17649d81b2fbe8917264e6b253a95a3f2eea1 (patch) | |
| tree | 8bef4d94a3948251430169d44356cfb49a343396 | |
| parent | cc43606b552b66154cc243186e252ff3933e4206 (diff) | |
| download | emacs-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.
| -rw-r--r-- | src/xwidget.c | 26 |
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 | ||