// -*- Mode: C++; indent-tabs-mode: nil; tab-width: 2 -*- /* * Copyright (C) 2012 Canonical Ltd * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * Authored by: Andrea Azzarone */ #include "XdndManagerImp.h" #include #include "unity-shared/UScreen.h" namespace unity { namespace { const std::string URI_TYPE = "text/uri-list"; } XdndManagerImp::XdndManagerImp(XdndStartStopNotifier::Ptr const& xdnd_start_stop_notifier, XdndCollectionWindow::Ptr const& xdnd_collection_window) : xdnd_start_stop_notifier_(xdnd_start_stop_notifier) , xdnd_collection_window_(xdnd_collection_window) , last_monitor_(-1) { xdnd_start_stop_notifier_->started.connect(sigc::mem_fun(this, &XdndManagerImp::OnDndStarted)); xdnd_start_stop_notifier_->finished.connect(sigc::mem_fun(this, &XdndManagerImp::OnDndFinished)); xdnd_collection_window_->collected.connect(sigc::mem_fun(this, &XdndManagerImp::OnDndDataCollected)); } int XdndManagerImp::Monitor() const { return last_monitor_; } void XdndManagerImp::OnDndStarted() { xdnd_collection_window_->Collect(); } void XdndManagerImp::OnDndFinished() { xdnd_collection_window_->Deactivate(); mouse_poller_timeout_.reset(); if (!dnd_data_.empty()) { dnd_data_.clear(); dnd_finished.emit(); } } void XdndManagerImp::OnDndDataCollected(std::vector const& mimes) { if (!IsAValidDnd(mimes)) return; dnd_data_ = xdnd_collection_window_->GetData(URI_TYPE); if (dnd_data_.empty()) return; auto uscreen = UScreen::GetDefault(); last_monitor_ = uscreen->GetMonitorWithMouse(); mouse_poller_timeout_.reset(new glib::Timeout(20, sigc::mem_fun(this, &XdndManagerImp::CheckMousePosition))); dnd_started.emit(dnd_data_, last_monitor_); } bool XdndManagerImp::IsAValidDnd(std::vector const& mimes) { auto end = std::end(mimes); auto it = std::find(std::begin(mimes), end, URI_TYPE); return it != end; } bool XdndManagerImp::CheckMousePosition() { auto uscreen = UScreen::GetDefault(); auto monitor = uscreen->GetMonitorWithMouse(); if (!dnd_data_.empty() && monitor != last_monitor_) { int old_monitor = last_monitor_; last_monitor_ = monitor; monitor_changed.emit(dnd_data_, old_monitor, last_monitor_); } return true; } }