From 8757551da09bdccc0080208bfec7116f4330b3c5 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Tue, 22 Mar 2022 11:26:46 +0000 Subject: [PATCH] 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 5d0385f6d9d..3ded7a80f4d 100644 --- a/src/haiku_support.cc +++ b/src/haiku_support.cc @@ -37,6 +37,7 @@ along with GNU Emacs. If not, see . */ #include #include #include +#include #include @@ -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 9c21a80e20d..c978926e735 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 7bb613af6e2..14d4c870c1f 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 efaafbfac20..b0bbee9e3bc 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 65fd51e237c..bce1c627eb2 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; -- 2.39.5