emacs-diffs
[Top][All Lists]
Advanced

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

master e37ffc379e: Improve robustness of override-redirect on Haiku


From: Po Lu
Subject: master e37ffc379e: Improve robustness of override-redirect on Haiku
Date: Tue, 8 Feb 2022 07:21:24 -0500 (EST)

branch: master
commit e37ffc379e66d45745e037b3a483460d25609e62
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    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.
---
 src/haiku_support.cc | 35 +++++++++++++++++++++++------------
 1 file changed, 23 insertions(+), 12 deletions(-)

diff --git a/src/haiku_support.cc b/src/haiku_support.cc
index 0aeff104da..71aa323b07 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);
        }
 



reply via email to

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