Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Correctly handle maximize/fullscreen in window without thickFrame #6417

Merged
merged 4 commits into from
Jul 9, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 43 additions & 9 deletions atom/browser/native_window_views.cc
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include "ui/aura/window_tree_host.h"
#include "ui/base/hit_test.h"
#include "ui/gfx/image/image.h"
#include "ui/gfx/screen.h"
#include "ui/views/background.h"
#include "ui/views/controls/webview/unhandled_keyboard_event_handler.h"
#include "ui/views/controls/webview/webview.h"
Expand Down Expand Up @@ -278,13 +279,6 @@ NativeWindowViews::NativeWindowViews(
AddChildView(web_view_);

#if defined(OS_WIN)
// Save initial window state.
if (fullscreen)
last_window_state_ = ui::SHOW_STATE_FULLSCREEN;
else
last_window_state_ = ui::SHOW_STATE_NORMAL;
last_normal_size_ = gfx::Size(widget_size_);

if (!has_frame()) {
// Set Window style so that we get a minimize and maximize animation when
// frameless.
Expand Down Expand Up @@ -324,6 +318,15 @@ NativeWindowViews::NativeWindowViews(

window_->CenterWindow(size);
Layout();

#if defined(OS_WIN)
// Save initial window state.
if (fullscreen)
last_window_state_ = ui::SHOW_STATE_FULLSCREEN;
else
last_window_state_ = ui::SHOW_STATE_NORMAL;
last_normal_bounds_ = GetBounds();
#endif
}

NativeWindowViews::~NativeWindowViews() {
Expand Down Expand Up @@ -415,6 +418,17 @@ bool NativeWindowViews::IsEnabled() {
}

void NativeWindowViews::Maximize() {
#if defined(OS_WIN)
// For window without WS_THICKFRAME style, we can not call Maximize().
if (!thick_frame_) {
restore_bounds_ = GetBounds();
auto display =
gfx::Screen::GetScreen()->GetDisplayNearestPoint(GetPosition());
SetBounds(display.work_area(), false);
return;
}
#endif

if (IsVisible())
window_->Maximize();
else
Expand All @@ -423,6 +437,13 @@ void NativeWindowViews::Maximize() {
}

void NativeWindowViews::Unmaximize() {
#if defined(OS_WIN)
if (!thick_frame_) {
SetBounds(restore_bounds_, false);
return;
}
#endif

window_->Restore();
}

Expand Down Expand Up @@ -459,6 +480,20 @@ void NativeWindowViews::SetFullScreen(bool fullscreen) {
last_window_state_ = ui::SHOW_STATE_NORMAL;
NotifyWindowLeaveFullScreen();
}

// For window without WS_THICKFRAME style, we can not call SetFullscreen().
if (!thick_frame_) {
if (fullscreen) {
restore_bounds_ = GetBounds();
auto display =
gfx::Screen::GetScreen()->GetDisplayNearestPoint(GetPosition());
SetBounds(display.bounds(), false);
} else {
SetBounds(restore_bounds_, false);
}
return;
}

// We set the new value after notifying, so we can handle the size event
// correctly.
window_->SetFullscreen(fullscreen);
Expand All @@ -475,8 +510,7 @@ bool NativeWindowViews::IsFullscreen() const {
return window_->IsFullscreen();
}

void NativeWindowViews::SetBounds(const gfx::Rect& bounds,
bool animate = false) {
void NativeWindowViews::SetBounds(const gfx::Rect& bounds, bool animate) {
#if defined(USE_X11)
// On Linux the minimum and maximum size should be updated with window size
// when window is not resizable.
Expand Down
5 changes: 4 additions & 1 deletion atom/browser/native_window_views.h
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ class NativeWindowViews : public NativeWindow,
// to receive the wrong size (#2498). To circumvent that, we keep tabs on the
// size of the window while in the normal state (not maximized, minimized or
// fullscreen), so we restore it correctly.
gfx::Size last_normal_size_;
gfx::Rect last_normal_bounds_;

// In charge of running taskbar related APIs.
TaskbarHost taskbar_host_;
Expand All @@ -223,6 +223,9 @@ class NativeWindowViews : public NativeWindow,
// Whether to show the WS_THICKFRAME style.
bool thick_frame_;

// The bounds of window before maximize/fullscreen.
gfx::Rect restore_bounds_;

// The icons of window and taskbar.
base::win::ScopedHICON window_icon_;
base::win::ScopedHICON app_icon_;
Expand Down
6 changes: 3 additions & 3 deletions atom/browser/native_window_views_win.cc
Original file line number Diff line number Diff line change
Expand Up @@ -140,15 +140,15 @@ void NativeWindowViews::HandleSizeEvent(WPARAM w_param, LPARAM l_param) {
case SIZE_RESTORED:
if (last_window_state_ == ui::SHOW_STATE_NORMAL) {
// Window was resized so we save it's new size.
last_normal_size_ = GetSize();
last_normal_bounds_ = GetBounds();
} else {
switch (last_window_state_) {
case ui::SHOW_STATE_MAXIMIZED:
last_window_state_ = ui::SHOW_STATE_NORMAL;

// When the window is restored we resize it to the previous known
// normal size.
NativeWindow::SetSize(last_normal_size_);
SetBounds(last_normal_bounds_, false);

NotifyWindowUnmaximize();
break;
Expand All @@ -161,7 +161,7 @@ void NativeWindowViews::HandleSizeEvent(WPARAM w_param, LPARAM l_param) {

// When the window is restored we resize it to the previous known
// normal size.
NativeWindow::SetSize(last_normal_size_);
SetBounds(last_normal_bounds_, false);

NotifyWindowRestore();
}
Expand Down