emacs-diffs
[Top][All Lists]
Advanced

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

master 9e48d7468a: Implement `above' z-group on Haiku


From: Po Lu
Subject: master 9e48d7468a: Implement `above' z-group on Haiku
Date: Wed, 20 Apr 2022 03:38:59 -0400 (EDT)

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

    Implement `above' z-group on Haiku
    
    * src/haiku_support.cc (class EmacsWindow): New field `z_group'.
    (RecomputeFeel): New function.
    (ParentTo, BWindow_set_override_redirect): Use that instead
    instead of manually juggling the window feel around.
    (BWindow_set_z_group): New function.
    
    * src/haiku_support.h (enum haiku_z_group): New enum.
    * src/haikufns.c (haiku_set_parent_frame): Clean up coding
    style.
    (haiku_set_z_group): New function.
    (haiku_create_frame): Always set z group after window creation,
    like on X.
    (haiku_frame_parm_handlers): Add `haiku_set_z_group'.
---
 src/haiku_support.cc | 48 ++++++++++++++++++++++++++++++++++++++++++------
 src/haiku_support.h  | 30 +++++++++++++++++++-----------
 src/haikufns.c       | 49 +++++++++++++++++++++++++++++++++++++++++++++----
 3 files changed, 106 insertions(+), 21 deletions(-)

diff --git a/src/haiku_support.cc b/src/haiku_support.cc
index af37fe7a62..18a6318216 100644
--- a/src/haiku_support.cc
+++ b/src/haiku_support.cc
@@ -499,11 +499,13 @@ public:
   uint32 pre_override_redirect_workspaces;
   int window_id;
   bool *menus_begun = NULL;
+  enum haiku_z_group z_group;
 
   EmacsWindow () : BWindow (BRect (0, 0, 0, 0), "", B_TITLED_WINDOW_LOOK,
                            B_NORMAL_WINDOW_FEEL, 
B_NO_SERVER_SIDE_WINDOW_MODIFIERS)
   {
     window_id = current_window_id++;
+    z_group = Z_GROUP_NONE;
 
     /* This pulse rate is used by scroll bars for repeating a button
        action while a button is held down.  */
@@ -530,6 +532,19 @@ public:
     child_frame_lock.Unlock ();
   }
 
+  void
+  RecomputeFeel (void)
+  {
+    if (override_redirect_p)
+      SetFeel (kMenuWindowFeel);
+    else if (parent)
+      SetFeel (B_FLOATING_SUBSET_WINDOW_FEEL);
+    else if (z_group == Z_GROUP_ABOVE)
+      SetFeel (B_FLOATING_ALL_WINDOW_FEEL);
+    else
+      SetFeel (B_NORMAL_WINDOW_FEEL);
+  }
+
   BRect
   CalculateZoomRect (void)
   {
@@ -648,12 +663,17 @@ public:
   void
   Unparent (void)
   {
+    EmacsWindow *parent;
+
     if (!child_frame_lock.Lock ())
       gui_abort ("Failed to lock child frame state lock");
-    this->SetFeel (B_NORMAL_WINDOW_FEEL);
+
+    parent = this->parent;
+    this->parent = NULL;
+    RecomputeFeel ();
     UpwardsUnSubsetChildren (parent);
     this->RemoveFromSubset (this);
-    this->parent = NULL;
+
     if (fullscreen_p)
       {
        fullscreen_p = 0;
@@ -704,7 +724,7 @@ public:
       UnparentAndUnlink ();
 
     this->parent = window;
-    this->SetFeel (B_FLOATING_SUBSET_WINDOW_FEEL);
+    RecomputeFeel ();
     this->AddToSubset (this);
     if (!IsHidden () && this->parent)
       UpwardsSubsetChildren (parent);
@@ -4116,9 +4136,8 @@ BWindow_set_override_redirect (void *window, bool 
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_look = w->Look ();
-         w->SetFeel (kMenuWindowFeel);
+         w->RecomputeFeel ();
          w->SetLook (B_NO_BORDER_WINDOW_LOOK);
          w->pre_override_redirect_workspaces = w->Workspaces ();
          w->SetWorkspaces (B_ALL_WORKSPACES);
@@ -4126,8 +4145,8 @@ BWindow_set_override_redirect (void *window, bool 
override_redirect_p)
       else if (w->override_redirect_p)
        {
          w->override_redirect_p = false;
-         w->SetFeel (w->pre_override_redirect_feel);
          w->SetLook (w->pre_override_redirect_look);
+         w->RecomputeFeel ();
          w->SetWorkspaces (w->pre_override_redirect_workspaces);
        }
 
@@ -4286,3 +4305,20 @@ be_replay_menu_bar_event (void *menu_bar,
   messenger.SendMessage (&msg, &reply);
   return reply.what == BE_MENU_BAR_OPEN;
 }
+
+void
+BWindow_set_z_group (void *window, enum haiku_z_group z_group)
+{
+  EmacsWindow *w = (EmacsWindow *) window;
+
+  if (w->LockLooper ())
+    {
+      if (w->z_group != z_group)
+       {
+         w->z_group = z_group;
+         w->RecomputeFeel ();
+       }
+
+      w->UnlockLooper ();
+    }
+}
diff --git a/src/haiku_support.h b/src/haiku_support.h
index 7f6f6e9b0d..dfcf83bf3b 100644
--- a/src/haiku_support.h
+++ b/src/haiku_support.h
@@ -38,21 +38,28 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
 
 enum haiku_cursor
   {
-    CURSOR_ID_NO_CURSOR = 12,
-    CURSOR_ID_RESIZE_NORTH = 15,
-    CURSOR_ID_RESIZE_EAST = 16,
-    CURSOR_ID_RESIZE_SOUTH = 17,
-    CURSOR_ID_RESIZE_WEST = 18,
-    CURSOR_ID_RESIZE_NORTH_EAST = 19,
-    CURSOR_ID_RESIZE_NORTH_WEST = 20,
-    CURSOR_ID_RESIZE_SOUTH_EAST = 21,
-    CURSOR_ID_RESIZE_SOUTH_WEST = 22,
-    CURSOR_ID_RESIZE_NORTH_SOUTH = 23,
-    CURSOR_ID_RESIZE_EAST_WEST = 24,
+    CURSOR_ID_NO_CURSOR                           = 12,
+    CURSOR_ID_RESIZE_NORTH                = 15,
+    CURSOR_ID_RESIZE_EAST                 = 16,
+    CURSOR_ID_RESIZE_SOUTH                = 17,
+    CURSOR_ID_RESIZE_WEST                 = 18,
+    CURSOR_ID_RESIZE_NORTH_EAST                   = 19,
+    CURSOR_ID_RESIZE_NORTH_WEST                   = 20,
+    CURSOR_ID_RESIZE_SOUTH_EAST                   = 21,
+    CURSOR_ID_RESIZE_SOUTH_WEST                   = 22,
+    CURSOR_ID_RESIZE_NORTH_SOUTH          = 23,
+    CURSOR_ID_RESIZE_EAST_WEST            = 24,
     CURSOR_ID_RESIZE_NORTH_EAST_SOUTH_WEST = 25,
     CURSOR_ID_RESIZE_NORTH_WEST_SOUTH_EAST = 26
   };
 
+enum haiku_z_group
+  {
+    Z_GROUP_ABOVE,
+    Z_GROUP_NONE,
+    Z_GROUP_BELOW,
+  };
+
 enum haiku_alert_type
   {
     HAIKU_EMPTY_ALERT = 0,
@@ -459,6 +466,7 @@ extern void BWindow_send_behind (void *, void *);
 extern bool BWindow_is_active (void *);
 extern void BWindow_set_override_redirect (void *, bool);
 extern void BWindow_dimensions (void *, int *, int *);
+extern void BWindow_set_z_group (void *, enum haiku_z_group);
 extern void BWindow_Flush (void *);
 
 extern void BFont_close (void *);
diff --git a/src/haikufns.c b/src/haikufns.c
index b19fdd5488..5fca46c41b 100644
--- a/src/haikufns.c
+++ b/src/haikufns.c
@@ -395,8 +395,8 @@ haiku_set_child_frame_border_width (struct frame *f,
 }
 
 static void
-haiku_set_parent_frame (struct frame *f,
-                       Lisp_Object new_value, Lisp_Object old_value)
+haiku_set_parent_frame (struct frame *f, Lisp_Object new_value,
+                       Lisp_Object old_value)
 {
   struct frame *p = NULL;
   block_input ();
@@ -421,6 +421,7 @@ haiku_set_parent_frame (struct frame *f,
       EmacsWindow_unparent (FRAME_HAIKU_WINDOW (f));
       FRAME_OUTPUT_DATA (f)->parent_desc = NULL;
     }
+
   if (!NILP (new_value))
     {
       EmacsWindow_parent_to (FRAME_HAIKU_WINDOW (f),
@@ -436,6 +437,43 @@ haiku_set_parent_frame (struct frame *f,
   unblock_input ();
 }
 
+static void
+haiku_set_z_group (struct frame *f, Lisp_Object new_value,
+                  Lisp_Object old_value)
+{
+  int rc;
+
+  /* Tooltip frames can't have Z groups, since the window feel is
+     overridden during frame creation.  */
+  if (FRAME_TOOLTIP_P (f))
+    return;
+
+  rc = 1;
+  block_input ();
+
+  if (NILP (new_value))
+    {
+      BWindow_set_z_group (FRAME_HAIKU_WINDOW (f), Z_GROUP_NONE);
+      FRAME_Z_GROUP (f) = z_group_none;
+    }
+  else if (EQ (new_value, Qabove))
+    {
+      BWindow_set_z_group (FRAME_HAIKU_WINDOW (f), Z_GROUP_ABOVE);
+      FRAME_Z_GROUP (f) = z_group_above;
+    }
+  else if (EQ (new_value, Qbelow))
+    {
+      BWindow_set_z_group (FRAME_HAIKU_WINDOW (f), Z_GROUP_BELOW);
+      FRAME_Z_GROUP (f) = z_group_below;
+    }
+  else
+    rc = 0;
+
+  unblock_input ();
+  if (!rc)
+    error ("Invalid z-group specification");
+}
+
 static void
 haiku_explicitly_set_name (struct frame *f, Lisp_Object arg, Lisp_Object 
oldval)
 {
@@ -726,11 +764,11 @@ haiku_create_frame (Lisp_Object parms)
                              RES_TYPE_NUMBER);
   if (FIXNUMP (tem))
     store_frame_param (f, Qmin_height, tem);
+
   adjust_frame_size (f, FRAME_COLS (f) * FRAME_COLUMN_WIDTH (f),
                     FRAME_LINES (f) * FRAME_LINE_HEIGHT (f), 5, 1,
                     Qx_create_frame_1);
 
-  gui_default_parameter (f, parms, Qz_group, Qnil, NULL, NULL, 
RES_TYPE_SYMBOL);
   gui_default_parameter (f, parms, Qno_focus_on_map, Qnil,
                         NULL, NULL, RES_TYPE_BOOLEAN);
   gui_default_parameter (f, parms, Qno_accept_focus, Qnil,
@@ -875,6 +913,9 @@ haiku_create_frame (Lisp_Object parms)
          || !FRAME_LIVE_P (XFRAME (KVAR (kb, Vdefault_minibuffer_frame)))))
     kset_default_minibuffer_frame (kb, frame);
 
+  gui_default_parameter (f, parms, Qz_group, Qnil,
+                        NULL, NULL, RES_TYPE_SYMBOL);
+
   for (tem = parms; CONSP (tem); tem = XCDR (tem))
     if (CONSP (XCAR (tem)) && !NILP (XCAR (XCAR (tem))))
       fset_param_alist (f, Fcons (XCAR (tem), f->param_alist));
@@ -2638,7 +2679,7 @@ frame_parm_handler haiku_frame_parm_handlers[] =
     NULL, /* set skip taskbar */
     haiku_set_no_focus_on_map,
     haiku_set_no_accept_focus,
-    NULL, /* set z group */
+    haiku_set_z_group,
     haiku_set_override_redirect,
     gui_set_no_special_glyphs,
     gui_set_alpha_background,



reply via email to

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