electron/shell/browser/ui/x/window_state_watcher.cc

64 lines
2 KiB
C++
Raw Normal View History

2014-11-25 03:46:30 +00:00
// Copyright (c) 2014 GitHub, Inc.
// Use of this source code is governed by the MIT license that can be
// found in the LICENSE file.
#include "shell/browser/ui/x/window_state_watcher.h"
#include "ui/gfx/x/x11.h"
#include "ui/gfx/x/x11_atom_cache.h"
2014-11-25 03:46:30 +00:00
namespace electron {
2014-11-25 03:46:30 +00:00
WindowStateWatcher::WindowStateWatcher(NativeWindowViews* window)
: window_(window),
widget_(window->GetAcceleratedWidget()),
window_state_atom_(gfx::GetAtom("_NET_WM_STATE")) {
ui::X11EventSource::GetInstance()->AddXEventObserver(this);
2014-11-25 03:46:30 +00:00
}
WindowStateWatcher::~WindowStateWatcher() {
ui::X11EventSource::GetInstance()->RemoveXEventObserver(this);
2014-11-25 03:46:30 +00:00
}
void WindowStateWatcher::WillProcessXEvent(XEvent* xev) {
if (IsWindowStateEvent(xev)) {
2014-11-25 04:43:25 +00:00
was_minimized_ = window_->IsMinimized();
was_maximized_ = window_->IsMaximized();
}
2014-11-25 03:46:30 +00:00
}
void WindowStateWatcher::DidProcessXEvent(XEvent* xev) {
if (IsWindowStateEvent(xev)) {
2014-11-25 04:43:25 +00:00
bool is_minimized = window_->IsMinimized();
bool is_maximized = window_->IsMaximized();
bool is_fullscreen = window_->IsFullscreen();
if (is_minimized != was_minimized_) {
if (is_minimized)
window_->NotifyWindowMinimize();
else
window_->NotifyWindowRestore();
} else if (is_maximized != was_maximized_) {
if (is_maximized)
window_->NotifyWindowMaximize();
else
window_->NotifyWindowUnmaximize();
} else {
// If this is neither a "maximize" or "minimize" event, then we think it
// is a "fullscreen" event.
// The "IsFullscreen()" becomes true immediately before "WillProcessEvent"
// is called, so we can not handle this like "maximize" and "minimize" by
// watching whether they have changed.
if (is_fullscreen)
window_->NotifyWindowEnterFullScreen();
else
window_->NotifyWindowLeaveFullScreen();
}
}
}
bool WindowStateWatcher::IsWindowStateEvent(XEvent* xev) const {
return (xev->xproperty.atom == window_state_atom_ &&
xev->type == PropertyNotify && xev->xproperty.window == widget_);
2014-11-25 03:46:30 +00:00
}
} // namespace electron