blob: 4900d575ac4f354e2ab387a640516fdaed67421b [file] [log] [blame]
// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "window_manager/event_consumer_registrar.h"
#include <algorithm>
#include "window_manager/event_consumer.h"
#include "window_manager/util.h"
#include "window_manager/window_manager.h"
using chromeos::WmIpcMessageType;
using std::find;
using std::make_pair;
using std::pair;
using std::set;
using std::vector;
using window_manager::util::XidStr;
namespace window_manager {
EventConsumerRegistrar::EventConsumerRegistrar(WindowManager* wm,
EventConsumer* event_consumer)
: wm_(wm),
event_consumer_(event_consumer) {
}
EventConsumerRegistrar::~EventConsumerRegistrar() {
for (vector<XWindow>::const_iterator it = window_event_xids_.begin();
it != window_event_xids_.end(); ++it) {
wm_->UnregisterEventConsumerForWindowEvents(*it, event_consumer_);
}
for (vector<pair<XWindow, XAtom> >::const_iterator it =
property_change_pairs_.begin();
it != property_change_pairs_.end(); ++it) {
wm_->UnregisterEventConsumerForPropertyChanges(
it->first, it->second, event_consumer_);
}
for (vector<WmIpcMessageType>::const_iterator it =
chrome_message_types_.begin();
it != chrome_message_types_.end(); ++it) {
wm_->UnregisterEventConsumerForChromeMessages(*it, event_consumer_);
}
for (set<XWindow>::const_iterator it = destroyed_xids_.begin();
it != destroyed_xids_.end(); ++it) {
wm_->UnregisterEventConsumerForDestroyedWindow(*it, event_consumer_);
}
wm_ = NULL;
event_consumer_ = NULL;
}
void EventConsumerRegistrar::RegisterForWindowEvents(XWindow xid) {
wm_->RegisterEventConsumerForWindowEvents(xid, event_consumer_);
window_event_xids_.push_back(xid);
}
void EventConsumerRegistrar::UnregisterForWindowEvents(XWindow xid) {
wm_->UnregisterEventConsumerForWindowEvents(xid, event_consumer_);
vector<XWindow>::iterator it = find(window_event_xids_.begin(),
window_event_xids_.end(),
xid);
DCHECK(it != window_event_xids_.end());
window_event_xids_.erase(it);
}
void EventConsumerRegistrar::RegisterForPropertyChanges(XWindow xid,
XAtom xatom) {
wm_->RegisterEventConsumerForPropertyChanges(xid, xatom, event_consumer_);
property_change_pairs_.push_back(make_pair(xid, xatom));
}
void EventConsumerRegistrar::UnregisterForPropertyChanges(XWindow xid,
XAtom xatom) {
wm_->UnregisterEventConsumerForPropertyChanges(xid, xatom, event_consumer_);
PropertyChangePairs::iterator it = find(property_change_pairs_.begin(),
property_change_pairs_.end(),
make_pair(xid, xatom));
DCHECK(it != property_change_pairs_.end());
property_change_pairs_.erase(it);
}
void EventConsumerRegistrar::RegisterForChromeMessages(
WmIpcMessageType message_type) {
wm_->RegisterEventConsumerForChromeMessages(message_type, event_consumer_);
chrome_message_types_.push_back(message_type);
}
void EventConsumerRegistrar::RegisterForDestroyedWindow(XWindow xid) {
wm_->RegisterEventConsumerForDestroyedWindow(xid, event_consumer_);
const bool inserted = destroyed_xids_.insert(xid).second;
DCHECK(inserted) << "Interest in destroyed window " << XidStr(xid)
<< " already registered for EventConsumer "
<< event_consumer_;
}
void EventConsumerRegistrar::HandleDestroyedWindow(XWindow xid) {
const size_t num_erased = destroyed_xids_.erase(xid);
DCHECK(num_erased) << "Got notice about destroyed window " << XidStr(xid)
<< " for EventConsumer " << event_consumer_ << ", but "
<< "this window wasn't previously registered";
}
} // namespace window_manager