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.
|
|
|
|
|
2019-06-19 20:46:59 +00:00
|
|
|
#include "shell/browser/ui/x/window_state_watcher.h"
|
2020-12-22 22:14:44 +00:00
|
|
|
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
#include "ui/base/x/x11_util.h"
|
2017-09-12 15:47:19 +00:00
|
|
|
#include "ui/gfx/x/x11_atom_cache.h"
|
2021-01-12 23:31:23 +00:00
|
|
|
#include "ui/gfx/x/xproto_util.h"
|
2014-11-25 03:46:30 +00:00
|
|
|
|
2019-06-19 21:23:04 +00:00
|
|
|
namespace electron {
|
2014-11-25 03:46:30 +00:00
|
|
|
|
|
|
|
WindowStateWatcher::WindowStateWatcher(NativeWindowViews* window)
|
2020-03-18 00:30:58 +00:00
|
|
|
: window_(window),
|
|
|
|
widget_(window->GetAcceleratedWidget()),
|
2021-02-02 17:50:32 +00:00
|
|
|
net_wm_state_atom_(x11::GetAtom("_NET_WM_STATE")),
|
|
|
|
net_wm_state_hidden_atom_(x11::GetAtom("_NET_WM_STATE_HIDDEN")),
|
|
|
|
net_wm_state_maximized_vert_atom_(
|
|
|
|
x11::GetAtom("_NET_WM_STATE_MAXIMIZED_VERT")),
|
|
|
|
net_wm_state_maximized_horz_atom_(
|
|
|
|
x11::GetAtom("_NET_WM_STATE_MAXIMIZED_HORZ")),
|
2022-01-17 07:46:52 +00:00
|
|
|
net_wm_state_fullscreen_atom_(x11::GetAtom("_NET_WM_STATE_FULLSCREEN")),
|
|
|
|
was_minimized_(window_->IsMinimized()),
|
|
|
|
was_maximized_(window_->IsMaximized()) {
|
2020-12-22 22:14:44 +00:00
|
|
|
ui::X11EventSource::GetInstance()->connection()->AddEventObserver(this);
|
2014-11-25 03:46:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
WindowStateWatcher::~WindowStateWatcher() {
|
2020-12-22 22:14:44 +00:00
|
|
|
ui::X11EventSource::GetInstance()->connection()->RemoveEventObserver(this);
|
2014-11-25 03:46:30 +00:00
|
|
|
}
|
|
|
|
|
2020-12-22 22:14:44 +00:00
|
|
|
void WindowStateWatcher::OnEvent(const x11::Event& x11_event) {
|
2020-06-22 17:35:10 +00:00
|
|
|
if (IsWindowStateEvent(x11_event)) {
|
2020-12-22 22:14:44 +00:00
|
|
|
std::vector<x11::Atom> wm_states;
|
2021-01-12 23:31:23 +00:00
|
|
|
if (GetArrayProperty(
|
2020-12-22 22:14:44 +00:00
|
|
|
static_cast<x11::Window>(window_->GetAcceleratedWidget()),
|
2021-02-02 17:50:32 +00:00
|
|
|
net_wm_state_atom_, &wm_states)) {
|
|
|
|
const auto props =
|
2020-12-22 22:14:44 +00:00
|
|
|
base::flat_set<x11::Atom>(std::begin(wm_states), std::end(wm_states));
|
2021-02-02 17:50:32 +00:00
|
|
|
const bool is_minimized = props.contains(net_wm_state_hidden_atom_);
|
|
|
|
const bool is_maximized =
|
|
|
|
props.contains(net_wm_state_maximized_vert_atom_) &&
|
|
|
|
props.contains(net_wm_state_maximized_horz_atom_);
|
|
|
|
const bool is_fullscreen = props.contains(net_wm_state_fullscreen_atom_);
|
2020-12-22 22:14:44 +00:00
|
|
|
|
|
|
|
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 "OnEvent"
|
|
|
|
// 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();
|
|
|
|
}
|
2022-01-17 07:46:52 +00:00
|
|
|
|
|
|
|
was_minimized_ = is_minimized;
|
|
|
|
was_maximized_ = is_maximized;
|
2014-11-25 04:43:25 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-12-22 22:14:44 +00:00
|
|
|
bool WindowStateWatcher::IsWindowStateEvent(const x11::Event& x11_event) const {
|
|
|
|
auto* property = x11_event.As<x11::PropertyNotifyEvent>();
|
2021-02-02 17:50:32 +00:00
|
|
|
return (property && property->atom == net_wm_state_atom_ &&
|
2020-08-12 18:33:58 +00:00
|
|
|
static_cast<uint32_t>(property->window) == widget_);
|
2014-11-25 03:46:30 +00:00
|
|
|
}
|
|
|
|
|
2019-06-19 21:23:04 +00:00
|
|
|
} // namespace electron
|