[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;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- master 8757551da0: Simplify fullscreen management on Haiku,
Po Lu <=