]> git.eshelyaron.com Git - emacs.git/commitdiff
Improve robustness of override-redirect on Haiku
authorPo Lu <luangruo@yahoo.com>
Tue, 8 Feb 2022 12:20:47 +0000 (12:20 +0000)
committerPo Lu <luangruo@yahoo.com>
Tue, 8 Feb 2022 12:20:47 +0000 (12:20 +0000)
* 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

index 0aeff104da94f7eda42760a584f3357bdfba3913..71aa323b07f8c9ce40531f1eb38d0eadaafe70fb 100644 (file)
@@ -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);
        }