emacs-diffs
[Top][All Lists]
Advanced

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

master 8757551da0: Simplify fullscreen management on Haiku


From: Po Lu
Subject: master 8757551da0: Simplify fullscreen management on Haiku
Date: Tue, 22 Mar 2022 07:28:57 -0400 (EDT)

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

    Simplify fullscreen management on Haiku
    
    * src/haiku_support.cc (class EmacsWindow, Zoom, UnZoom): Track
    zoom state manually instead of guessing what the system
    currently thinks it is.
    (MakeFullscreen): Always unzoom first.
    * src/haiku_support.h (struct haiku_zoom_event): Remove all
    fields and add a single field `zoomed'.
    * src/haikufns.c (haiku_create_frame, haiku_create_tip_frame):
    Remove use of pending_zoom fields.
    * src/haikuterm.c (haiku_read_socket): Simplify handling of zoom
    events.
    (haiku_fullscreen): Simplify handling of different zoom states.
    * src/haikuterm.h (struct haiku_output): Remove all pending_zoom
    fields since they are no longer required.
---
 src/haiku_support.cc | 111 +++++++++++++++++++++++++++++++++++++++++----------
 src/haiku_support.h  |   6 +--
 src/haikufns.c       |  10 -----
 src/haikuterm.c      |  37 ++---------------
 src/haikuterm.h      |   5 ---
 5 files changed, 94 insertions(+), 75 deletions(-)

diff --git a/src/haiku_support.cc b/src/haiku_support.cc
index 5d0385f6d9..3ded7a80f4 100644
--- a/src/haiku_support.cc
+++ b/src/haiku_support.cc
@@ -37,6 +37,7 @@ along with GNU Emacs.  If not, see 
<https://www.gnu.org/licenses/>.  */
 #include <interface/Alert.h>
 #include <interface/Button.h>
 #include <interface/ControlLook.h>
+#include <interface/Deskbar.h>
 
 #include <locale/UnicodeChar.h>
 
@@ -403,9 +404,9 @@ public:
   BRect pre_zoom_rect;
   int x_before_zoom = INT_MIN;
   int y_before_zoom = INT_MIN;
-  int fullscreen_p = 0;
-  int zoomed_p = 0;
-  int shown_flag = 0;
+  bool fullscreen_p = false;
+  bool zoomed_p = false;
+  bool shown_flag = false;
   volatile int was_shown_p = 0;
   bool menu_bar_active_p = false;
   bool override_redirect_p = false;
@@ -446,6 +447,77 @@ public:
     pthread_mutex_destroy (&menu_update_mutex);
   }
 
+  BRect
+  CalculateZoomRect (void)
+  {
+    BScreen screen (this);
+    BDeskbar deskbar;
+    BRect screen_frame;
+    BRect frame;
+    BRect deskbar_frame;
+    BRect window_frame;
+    BRect decorator_frame;
+
+    if (!screen.IsValid ())
+      gui_abort ("Failed to calculate screen rect");
+
+    screen_frame = frame = screen.Frame ();
+    deskbar_frame = deskbar.Frame ();
+
+    if (!(modifiers () & B_SHIFT_KEY)
+       && !deskbar.IsAutoHide ())
+      {
+       switch (deskbar.Location ())
+         {
+         case B_DESKBAR_TOP:
+           frame.top = deskbar_frame.bottom + 2;
+           break;
+
+         case B_DESKBAR_BOTTOM:
+         case B_DESKBAR_LEFT_BOTTOM:
+         case B_DESKBAR_RIGHT_BOTTOM:
+           frame.bottom = deskbar_frame.bottom - 2;
+           break;
+
+         case B_DESKBAR_LEFT_TOP:
+           if (deskbar.IsExpanded ())
+             frame.top = deskbar_frame.bottom + 2;
+           else
+             frame.left = deskbar_frame.right + 2;
+           break;
+
+         default:
+           if (deskbar.IsExpanded ()
+               && !deskbar.IsAlwaysOnTop ()
+               && !deskbar.IsAutoRaise ())
+             frame.right = deskbar_frame.left - 2;
+         }
+      }
+
+    window_frame = Frame ();
+    decorator_frame = DecoratorFrame ();
+
+    frame.top += (window_frame.top
+                 - decorator_frame.top);
+    frame.bottom -= (decorator_frame.bottom
+                    - window_frame.bottom);
+    frame.left += (window_frame.left
+                  - decorator_frame.left);
+    frame.right -= (decorator_frame.right
+                   - window_frame.right);
+
+    if (frame.top > deskbar_frame.bottom
+       || frame.bottom < deskbar_frame.top)
+      {
+       frame.left = screen_frame.left + (window_frame.left
+                                         - decorator_frame.left);
+       frame.right = screen_frame.right - (decorator_frame.right
+                                           - window_frame.left);
+      }
+
+    return frame;
+  }
+
   void
   UpwardsSubset (EmacsWindow *w)
   {
@@ -989,33 +1061,29 @@ public:
   Zoom (BPoint o, float w, float h)
   {
     struct haiku_zoom_event rq;
+    BRect rect;
     rq.window = this;
 
-    rq.x = o.x;
-    rq.y = o.y;
-
-    rq.width = w + 1;
-    rq.height = h + 1;
-
     if (fullscreen_p)
       MakeFullscreen (0);
 
-    if (o.x != x_before_zoom ||
-       o.y != y_before_zoom)
+    if (!zoomed_p)
       {
-       x_before_zoom = Frame ().left;
-       y_before_zoom = Frame ().top;
        pre_zoom_rect = Frame ();
-       zoomed_p = 1;
-       haiku_write (ZOOM_EVENT, &rq);
+       zoomed_p = true;
+       rect = CalculateZoomRect ();
       }
     else
       {
-       zoomed_p = 0;
-       x_before_zoom = y_before_zoom = INT_MIN;
+       zoomed_p = false;
+       rect = pre_zoom_rect;
       }
 
-    BWindow::Zoom (o, w, h);
+    rq.zoomed = zoomed_p;
+    haiku_write (ZOOM_EVENT, &rq);
+
+    BWindow::Zoom (rect.LeftTop (), BE_RECT_WIDTH (rect) - 1,
+                  BE_RECT_HEIGHT (rect) - 1);
   }
 
   void
@@ -1023,11 +1091,8 @@ public:
   {
     if (!zoomed_p)
       return;
-    zoomed_p = 0;
 
-    EmacsMoveTo (pre_zoom_rect.left, pre_zoom_rect.top);
-    ResizeTo (BE_RECT_WIDTH (pre_zoom_rect) - 1,
-             BE_RECT_HEIGHT (pre_zoom_rect) - 1);
+    BWindow::Zoom ();
   }
 
   void
@@ -1083,6 +1148,8 @@ public:
     if (!screen.IsValid ())
       gui_abort ("Trying to make a window fullscreen without a screen");
 
+    UnZoom ();
+
     if (make_fullscreen_p == fullscreen_p)
       return;
 
diff --git a/src/haiku_support.h b/src/haiku_support.h
index 9c21a80e20..c978926e73 100644
--- a/src/haiku_support.h
+++ b/src/haiku_support.h
@@ -220,10 +220,8 @@ struct haiku_menu_bar_help_event
 struct haiku_zoom_event
 {
   void *window;
-  int x;
-  int y;
-  int width;
-  int height;
+
+  bool zoomed;
 };
 
 #define FSPEC_FAMILY 1
diff --git a/src/haikufns.c b/src/haikufns.c
index 7bb613af6e..14d4c870c1 100644
--- a/src/haikufns.c
+++ b/src/haikufns.c
@@ -631,11 +631,6 @@ haiku_create_frame (Lisp_Object parms)
   f->output_method = output_haiku;
   f->output_data.haiku = xzalloc (sizeof *f->output_data.haiku);
 
-  f->output_data.haiku->pending_zoom_x = INT_MIN;
-  f->output_data.haiku->pending_zoom_y = INT_MIN;
-  f->output_data.haiku->pending_zoom_width = INT_MIN;
-  f->output_data.haiku->pending_zoom_height = INT_MIN;
-
   fset_icon_name (f, gui_display_get_arg (dpyinfo, parms, Qicon_name,
                                           "iconName", "Title",
                                           RES_TYPE_STRING));
@@ -961,11 +956,6 @@ haiku_create_tip_frame (Lisp_Object parms)
   f->output_method = output_haiku;
   f->output_data.haiku = xzalloc (sizeof *f->output_data.haiku);
 
-  f->output_data.haiku->pending_zoom_x = INT_MIN;
-  f->output_data.haiku->pending_zoom_y = INT_MIN;
-  f->output_data.haiku->pending_zoom_width = INT_MIN;
-  f->output_data.haiku->pending_zoom_height = INT_MIN;
-
   f->tooltip = true;
   fset_icon_name (f, Qnil);
   FRAME_DISPLAY_INFO (f) = dpyinfo;
diff --git a/src/haikuterm.c b/src/haikuterm.c
index efaafbfac2..b0bbee9e3b 100644
--- a/src/haikuterm.c
+++ b/src/haikuterm.c
@@ -2851,19 +2851,6 @@ haiku_read_socket (struct terminal *terminal, struct 
input_event *hold_quit)
                cancel_mouse_face (f);
                haiku_clear_under_internal_border (f);
              }
-
-           if (FRAME_OUTPUT_DATA (f)->pending_zoom_width != width ||
-               FRAME_OUTPUT_DATA (f)->pending_zoom_height != height)
-             {
-               FRAME_OUTPUT_DATA (f)->zoomed_p = 0;
-               haiku_make_fullscreen_consistent (f);
-             }
-           else
-             {
-               FRAME_OUTPUT_DATA (f)->zoomed_p = 1;
-               FRAME_OUTPUT_DATA (f)->pending_zoom_width = INT_MIN;
-               FRAME_OUTPUT_DATA (f)->pending_zoom_height = INT_MIN;
-             }
            break;
          }
        case FRAME_EXPOSED:
@@ -3249,16 +3236,6 @@ haiku_read_socket (struct terminal *terminal, struct 
input_event *hold_quit)
            if (!f)
              continue;
 
-           if (FRAME_OUTPUT_DATA (f)->pending_zoom_x != b->x ||
-               FRAME_OUTPUT_DATA (f)->pending_zoom_y != b->y)
-             FRAME_OUTPUT_DATA (f)->zoomed_p = 0;
-           else
-             {
-               FRAME_OUTPUT_DATA (f)->zoomed_p = 1;
-               FRAME_OUTPUT_DATA (f)->pending_zoom_x = INT_MIN;
-               FRAME_OUTPUT_DATA (f)->pending_zoom_y = INT_MIN;
-             }
-
            if (FRAME_PARENT_FRAME (f))
              haiku_coords_from_parent (f, &b->x, &b->y);
 
@@ -3570,12 +3547,7 @@ haiku_read_socket (struct terminal *terminal, struct 
input_event *hold_quit)
            if (!f)
              continue;
 
-           FRAME_OUTPUT_DATA (f)->pending_zoom_height = b->height;
-           FRAME_OUTPUT_DATA (f)->pending_zoom_width = b->width;
-           FRAME_OUTPUT_DATA (f)->pending_zoom_x = b->x;
-           FRAME_OUTPUT_DATA (f)->pending_zoom_y = b->y;
-
-           FRAME_OUTPUT_DATA (f)->zoomed_p = 1;
+           FRAME_OUTPUT_DATA (f)->zoomed_p = b->zoomed;
            haiku_make_fullscreen_consistent (f);
            break;
          }
@@ -3821,13 +3793,10 @@ haiku_fullscreen (struct frame *f)
     return;
 
   if (f->want_fullscreen == FULLSCREEN_MAXIMIZED)
-    {
-      EmacsWindow_make_fullscreen (FRAME_HAIKU_WINDOW (f), 0);
-      BWindow_zoom (FRAME_HAIKU_WINDOW (f));
-    }
+    BWindow_zoom (FRAME_HAIKU_WINDOW (f));
   else if (f->want_fullscreen == FULLSCREEN_BOTH)
     EmacsWindow_make_fullscreen (FRAME_HAIKU_WINDOW (f), 1);
-  else if (f->want_fullscreen == FULLSCREEN_NONE)
+  else
     {
       EmacsWindow_make_fullscreen (FRAME_HAIKU_WINDOW (f), 0);
       EmacsWindow_unzoom (FRAME_HAIKU_WINDOW (f));
diff --git a/src/haikuterm.h b/src/haikuterm.h
index 65fd51e237..bce1c627eb 100644
--- a/src/haikuterm.h
+++ b/src/haikuterm.h
@@ -150,11 +150,6 @@ struct haiku_output
   int menu_up_to_date_p;
   int zoomed_p;
 
-  int pending_zoom_x;
-  int pending_zoom_y;
-  int pending_zoom_width;
-  int pending_zoom_height;
-
   int menu_bar_open_p;
 
   struct font *font;



reply via email to

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