Autogenerated with:
cp dom/.clang-format widget/ && mach format widget/**.{cpp,h,mm}
Manual changes:
* Had to add a manual override in nsWaylandDisplay.h /
DMABufFormats.cpp to include mozwayland before protocols.
* Missing includes in nsWindowWayland/X11.h / nsDragService.
* nsFilePicker missed an nsWindow forward declaration.
* Various overrides in widget/windows because windows headers are order
dependent.
Differential Revision: https://phabricator.services.mozilla.com/D311688
116 lines
3.0 KiB
C++
116 lines
3.0 KiB
C++
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "nsNativeDragSource.h"
|
|
|
|
#include "mozilla/Logging.h" //for mozilla::TrueOrFalse
|
|
#include "mozilla/dom/DataTransfer.h"
|
|
#include "mozilla/widget/WidgetLogging.h"
|
|
#include "nsIDragService.h"
|
|
#include "nsISupportsImpl.h"
|
|
#include "nsServiceManagerUtils.h"
|
|
#include "nsString.h"
|
|
#include "nsToolkit.h"
|
|
#include "nsWidgetsCID.h"
|
|
|
|
#define LOGD DRAGSERVICE_LOGD
|
|
#define LOGI DRAGSERVICE_LOGI
|
|
#define LOGE DRAGSERVICE_LOGE
|
|
|
|
/*
|
|
* class nsNativeDragSource
|
|
*/
|
|
nsNativeDragSource::nsNativeDragSource(
|
|
mozilla::dom::DataTransfer* aDataTransfer)
|
|
: m_cRef(0), m_hCursor(nullptr), mUserCancelled(false) {
|
|
LOGD("[%p] %s", this, __FUNCTION__);
|
|
mDataTransfer = aDataTransfer;
|
|
}
|
|
|
|
nsNativeDragSource::~nsNativeDragSource() {
|
|
LOGD("[%p] %s", this, __FUNCTION__);
|
|
}
|
|
|
|
STDMETHODIMP
|
|
nsNativeDragSource::QueryInterface(REFIID riid, void** ppv) {
|
|
*ppv = nullptr;
|
|
|
|
if (IID_IUnknown == riid || IID_IDropSource == riid) *ppv = this;
|
|
|
|
if (nullptr != *ppv) {
|
|
((LPUNKNOWN)*ppv)->AddRef();
|
|
return S_OK;
|
|
}
|
|
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG)
|
|
nsNativeDragSource::AddRef(void) {
|
|
++m_cRef;
|
|
NS_LOG_ADDREF(this, m_cRef, "nsNativeDragSource", sizeof(*this));
|
|
return m_cRef;
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG)
|
|
nsNativeDragSource::Release(void) {
|
|
--m_cRef;
|
|
NS_LOG_RELEASE(this, m_cRef, "nsNativeDragSource");
|
|
if (0 != m_cRef) return m_cRef;
|
|
|
|
delete this;
|
|
return 0;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
nsNativeDragSource::QueryContinueDrag(BOOL fEsc, DWORD grfKeyState) {
|
|
LOGD("%s | fEsc: %s | grfKeyState: %lu | grfKeyState has button: %s",
|
|
__FUNCTION__, mozilla::TrueOrFalse(fEsc), grfKeyState,
|
|
mozilla::TrueOrFalse((grfKeyState & MK_LBUTTON) ||
|
|
(grfKeyState & MK_RBUTTON)));
|
|
nsCOMPtr<nsIDragService> dragService =
|
|
do_GetService("@mozilla.org/widget/dragservice;1");
|
|
if (dragService) {
|
|
nsCOMPtr<nsIDragSession> session;
|
|
dragService->GetCurrentSession(nullptr, getter_AddRefs(session));
|
|
if (session) {
|
|
DWORD pos = ::GetMessagePos();
|
|
session->DragMoved(GET_X_LPARAM(pos), GET_Y_LPARAM(pos));
|
|
}
|
|
}
|
|
|
|
if (fEsc) {
|
|
mUserCancelled = true;
|
|
return DRAGDROP_S_CANCEL;
|
|
}
|
|
|
|
if (!(grfKeyState & MK_LBUTTON) || (grfKeyState & MK_RBUTTON))
|
|
return DRAGDROP_S_DROP;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
nsNativeDragSource::GiveFeedback(DWORD dwEffect) {
|
|
// For drags involving tabs, we do some custom work with cursors.
|
|
if (mDataTransfer) {
|
|
nsAutoString cursor;
|
|
mDataTransfer->GetMozCursor(cursor);
|
|
if (cursor.EqualsLiteral("default")) {
|
|
m_hCursor = ::LoadCursor(0, IDC_ARROW);
|
|
} else {
|
|
m_hCursor = nullptr;
|
|
}
|
|
}
|
|
|
|
LOGD("%s | next m_hCursor: %p", __FUNCTION__, m_hCursor);
|
|
if (m_hCursor) {
|
|
::SetCursor(m_hCursor);
|
|
return S_OK;
|
|
}
|
|
|
|
// Let the system choose which cursor to apply.
|
|
return DRAGDROP_S_USEDEFAULTCURSORS;
|
|
}
|