[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master 726969a4b4: Remove flickering when toggling between different ful
From: |
Po Lu |
Subject: |
master 726969a4b4: Remove flickering when toggling between different fullscreen states on Haiku |
Date: |
Fri, 20 May 2022 01:34:28 -0400 (EDT) |
branch: master
commit 726969a4b4e3e0f298b95a04d23e7a131d7abec7
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>
Remove flickering when toggling between different fullscreen states on Haiku
* src/haiku_support.cc (FrameMoved): Don't allow moving the
frame along the "filled" axis when fullwidth or fullheight.
(ClearFullscreen): New argument `mode'. Return the previous
rect but don't revert the frame to it if the target mode is not
NONE.
(SetFullscreen): Use rect provided by ClearFullscreen instead.
---
src/haiku_support.cc | 53 ++++++++++++++++++++++++++++++++++++++--------------
1 file changed, 39 insertions(+), 14 deletions(-)
diff --git a/src/haiku_support.cc b/src/haiku_support.cc
index 0b3ab4cf4a..3961d33e4d 100644
--- a/src/haiku_support.cc
+++ b/src/haiku_support.cc
@@ -1042,6 +1042,20 @@ public:
BRect frame, decorator_frame;
struct child_frame *f;
+ if (fullscreen_mode == FULLSCREEN_MODE_WIDTH
+ && new_position.x != 0)
+ {
+ MoveTo (0, new_position.y);
+ return;
+ }
+
+ if (fullscreen_mode == FULLSCREEN_MODE_HEIGHT
+ && new_position.y != 0)
+ {
+ MoveTo (new_position.x, 0);
+ return;
+ }
+
rq.window = this;
rq.x = std::lrint (new_position.x);
rq.y = std::lrint (new_position.y);
@@ -1159,34 +1173,46 @@ public:
child_frame_lock.Unlock ();
}
- void
- ClearFullscreen (void)
+ BRect
+ ClearFullscreen (enum haiku_fullscreen_mode target_mode)
{
+ BRect original_frame;
+
switch (fullscreen_mode)
{
case FULLSCREEN_MODE_MAXIMIZED:
- BWindow::Zoom (pre_zoom_rect.LeftTop (),
- BE_RECT_WIDTH (pre_zoom_rect) - 1,
- BE_RECT_HEIGHT (pre_zoom_rect) - 1);
+ original_frame = pre_zoom_rect;
+
+ if (target_mode == FULLSCREEN_MODE_NONE)
+ BWindow::Zoom (pre_zoom_rect.LeftTop (),
+ BE_RECT_WIDTH (pre_zoom_rect) - 1,
+ BE_RECT_HEIGHT (pre_zoom_rect) - 1);
break;
case FULLSCREEN_MODE_BOTH:
case FULLSCREEN_MODE_HEIGHT:
case FULLSCREEN_MODE_WIDTH:
- MoveTo (pre_fullscreen_rect.LeftTop ());
- ResizeTo (BE_RECT_WIDTH (pre_fullscreen_rect) - 1,
- BE_RECT_HEIGHT (pre_fullscreen_rect) - 1);
-
+ original_frame = pre_fullscreen_rect;
SetFlags (Flags () & ~(B_NOT_MOVABLE
| B_NOT_ZOOMABLE
| B_NOT_RESIZABLE));
+
+ if (target_mode != FULLSCREEN_MODE_NONE)
+ goto out;
+
+ MoveTo (pre_fullscreen_rect.LeftTop ());
+ ResizeTo (BE_RECT_WIDTH (pre_fullscreen_rect) - 1,
+ BE_RECT_HEIGHT (pre_fullscreen_rect) - 1);
break;
case FULLSCREEN_MODE_NONE:
+ original_frame = Frame ();
break;
}
+ out:
fullscreen_mode = FULLSCREEN_MODE_NONE;
+ return original_frame;
}
BRect
@@ -1211,17 +1237,17 @@ public:
void
SetFullscreen (enum haiku_fullscreen_mode mode)
{
- BRect zoom_rect;
+ BRect zoom_rect, frame;
if (fullscreen_mode == mode)
return;
- ClearFullscreen ();
+ frame = ClearFullscreen (mode);
switch (mode)
{
case FULLSCREEN_MODE_MAXIMIZED:
- pre_zoom_rect = Frame ();
+ pre_zoom_rect = frame;
zoom_rect = CalculateZoomRect ();
BWindow::Zoom (zoom_rect.LeftTop (),
BE_RECT_WIDTH (zoom_rect) - 1,
@@ -1235,12 +1261,11 @@ public:
case FULLSCREEN_MODE_HEIGHT:
case FULLSCREEN_MODE_WIDTH:
SetFlags (Flags () | B_NOT_ZOOMABLE | B_NOT_RESIZABLE);
- pre_fullscreen_rect = Frame ();
+ pre_fullscreen_rect = frame;
zoom_rect = FullscreenRectForMode (mode);
ResizeTo (BE_RECT_WIDTH (zoom_rect) - 1,
BE_RECT_HEIGHT (zoom_rect) - 1);
MoveTo (zoom_rect.left, zoom_rect.top);
-
break;
case FULLSCREEN_MODE_NONE:
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- master 726969a4b4: Remove flickering when toggling between different fullscreen states on Haiku,
Po Lu <=