bug-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#55208: 29.0.50; MS-Windows GUI selection dialogs and double-bufferin


From: Po Lu
Subject: bug#55208: 29.0.50; MS-Windows GUI selection dialogs and double-buffering
Date: Sun, 08 May 2022 13:33:40 +0800
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.91 (gnu/linux)

Eli Zaretskii <eliz@gnu.org> writes:

> diff --git a/src/w32fns.c b/src/w32fns.c
> index 0f25c1a..e5becb5 100644
> --- a/src/w32fns.c
> +++ b/src/w32fns.c
> @@ -247,6 +247,8 @@ #define MENU_FREE_DELAY 1000
>  
>  static int w32_unicode_gui;
>  
> +static bool w32_selection_dialog_open;
> +
>  /* From w32menu.c  */
>  int menubar_in_use = 0;
>  
> @@ -4184,6 +4186,16 @@ w32_wnd_proc (HWND hwnd, UINT msg, WPARAM wParam, 
> LPARAM lParam)
>                      update_rect.left, update_rect.top,
>                      update_rect.right, update_rect.bottom));
>  #endif
> +         /* Under double-buffering, update the frame from the back
> +            buffer, to prevent a "ghost" of the selection dialog to
> +            be left on display while the user selects in the dialog.  */
> +         if (w32_selection_dialog_open
> +             && !w32_disable_double_buffering
> +             && FRAME_OUTPUT_DATA (f)->paint_dc)
> +           BitBlt (FRAME_OUTPUT_DATA (f)->paint_buffer_handle,
> +                   0, 0, FRAME_PIXEL_WIDTH (f), FRAME_PIXEL_HEIGHT (f),
> +                   FRAME_OUTPUT_DATA (f)->paint_dc, 0, 0, SRCCOPY);
> +
>           EndPaint (hwnd, &paintStruct);
>           leave_crit ();
>  
> @@ -7755,6 +7767,15 @@ w32_dialog_in_progress (Lisp_Object in_progress)
>  {
>    Lisp_Object frames, frame;
>  
> +  /* Indicate to w32_wnd_proc that the selection dialog is about to be
> +     open (or was closed, if IN_PROGRESS is nil).  */
> +  if (!w32_disable_double_buffering)
> +    {
> +      enter_crit ();
> +      w32_selection_dialog_open = !NILP (in_progress);
> +      leave_crit ();
> +    }
> +
>    /* Don't let frames in `above' z-group obscure dialog windows.  */
>    FOR_EACH_FRAME (frames, frame)
>      {

This seems to work fine, please go ahead and install it.  Thanks.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]