From: Po Lu Date: Tue, 8 Feb 2022 12:20:47 +0000 (+0000) Subject: Improve robustness of override-redirect on Haiku X-Git-Tag: emacs-29.0.90~2429 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=e37ffc379e66d45745e037b3a483460d25609e62;p=emacs.git Improve robustness of override-redirect on Haiku * src/haiku_support.cc (class EmacsWindow): New field `override_redirect_p'. (BWindow_change_decoration, BWindow_set_override_redirect): Set and restore from the saved pre-override redirect state fields if appropriate. --- diff --git a/src/haiku_support.cc b/src/haiku_support.cc index 0aeff104da9..71aa323b07f 100644 --- a/src/haiku_support.cc +++ b/src/haiku_support.cc @@ -433,7 +433,8 @@ public: int shown_flag = 0; volatile int was_shown_p = 0; bool menu_bar_active_p = false; - window_look pre_override_redirect_style; + bool override_redirect_p = false; + window_look pre_override_redirect_look; window_feel pre_override_redirect_feel; uint32 pre_override_redirect_workspaces; pthread_mutex_t menu_update_mutex = PTHREAD_MUTEX_INITIALIZER; @@ -2305,13 +2306,24 @@ BView_convert_from_screen (void *view, int *x, int *y) void BWindow_change_decoration (void *window, int decorate_p) { - BWindow *w = (BWindow *) window; + EmacsWindow *w = (EmacsWindow *) window; if (!w->LockLooper ()) gui_abort ("Failed to lock window while changing its decorations"); - if (decorate_p) - w->SetLook (B_TITLED_WINDOW_LOOK); + + if (!w->override_redirect_p) + { + if (decorate_p) + w->SetLook (B_TITLED_WINDOW_LOOK); + else + w->SetLook (B_NO_BORDER_WINDOW_LOOK); + } else - w->SetLook (B_NO_BORDER_WINDOW_LOOK); + { + if (decorate_p) + w->pre_override_redirect_look = B_TITLED_WINDOW_LOOK; + else + w->pre_override_redirect_look = B_NO_BORDER_WINDOW_LOOK; + } w->UnlockLooper (); } @@ -3339,9 +3351,6 @@ be_use_subpixel_antialiasing (void) return current_subpixel_antialiasing; } -/* This isn't implemented very properly (for example: what if - decorations are changed while the window is under override - redirect?) but it works well enough for most use cases. */ void BWindow_set_override_redirect (void *window, bool override_redirect_p) { @@ -3349,19 +3358,21 @@ BWindow_set_override_redirect (void *window, bool override_redirect_p) if (w->LockLooper ()) { - if (override_redirect_p) + if (override_redirect_p && !w->override_redirect_p) { + w->override_redirect_p = true; w->pre_override_redirect_feel = w->Feel (); - w->pre_override_redirect_style = w->Look (); + w->pre_override_redirect_look = w->Look (); w->SetFeel (kMenuWindowFeel); w->SetLook (B_NO_BORDER_WINDOW_LOOK); w->pre_override_redirect_workspaces = w->Workspaces (); w->SetWorkspaces (B_ALL_WORKSPACES); } - else + else if (w->override_redirect_p) { + w->override_redirect_p = false; w->SetFeel (w->pre_override_redirect_feel); - w->SetLook (w->pre_override_redirect_style); + w->SetLook (w->pre_override_redirect_look); w->SetWorkspaces (w->pre_override_redirect_workspaces); }