Enable eraser support for Wacom tablets on Skia/Win back-end

Related to #610
This commit is contained in:
David Capello 2016-04-20 22:33:10 -03:00
parent 47708a6826
commit a58cbfbc1c
12 changed files with 170 additions and 41 deletions

View File

@ -113,6 +113,7 @@ protected:
if (lmb->isPressed(msg) || rmb->isPressed(msg)) {
MouseMessage mouseMsg(
(msg->type() == kKeyDownMessage ? kMouseDownMessage: kMouseUpMessage),
PointerType::Unknown,
(lmb->isPressed(msg) ? kButtonLeft: kButtonRight),
msg->modifiers(),
ui::get_mouse_position());

View File

@ -164,6 +164,7 @@ Editor::Editor(Document* document, EditorFlags flags)
, m_antsOffset(0)
, m_customizationDelegate(NULL)
, m_docView(NULL)
, m_lastPointerType(ui::PointerType::Unknown)
, m_flags(flags)
, m_secondaryButton(false)
, m_aniSpeed(1.0)
@ -919,6 +920,12 @@ tools::Tool* Editor::getCurrentEditorTool()
if (m_quicktool)
return m_quicktool;
// Eraser tip
if (m_lastPointerType == ui::PointerType::Eraser) {
tools::ToolBox* toolbox = App::instance()->getToolBox();
return toolbox->getToolById(tools::WellKnownTools::Eraser);
}
tools::Tool* tool = App::instance()->activeTool();
if (m_secondaryButton &&
@ -1277,6 +1284,8 @@ bool Editor::onProcessMessage(Message* msg)
MouseMessage* mouseMsg = static_cast<MouseMessage*>(msg);
m_oldPos = mouseMsg->position();
m_lastPointerType = mouseMsg->pointerType();
if (!m_secondaryButton && mouseMsg->right()) {
m_secondaryButton = mouseMsg->right();
@ -1293,6 +1302,9 @@ bool Editor::onProcessMessage(Message* msg)
case kMouseMoveMessage:
if (m_sprite) {
EditorStatePtr holdState(m_state);
m_lastPointerType = static_cast<MouseMessage*>(msg)->pointerType();
return m_state->onMouseMove(this, static_cast<MouseMessage*>(msg));
}
break;
@ -1303,6 +1315,8 @@ bool Editor::onProcessMessage(Message* msg)
MouseMessage* mouseMsg = static_cast<MouseMessage*>(msg);
bool result = m_state->onMouseUp(this, mouseMsg);
m_lastPointerType = mouseMsg->pointerType();
if (!hasCapture()) {
m_secondaryButton = false;
@ -1320,6 +1334,9 @@ bool Editor::onProcessMessage(Message* msg)
if (m_sprite) {
MouseMessage* mouseMsg = static_cast<MouseMessage*>(msg);
EditorStatePtr holdState(m_state);
m_lastPointerType = mouseMsg->pointerType();
bool used = m_state->onDoubleClick(this, mouseMsg);
if (used)
return true;

View File

@ -28,6 +28,7 @@
#include "render/zoom.h"
#include "ui/base.h"
#include "ui/cursor_type.h"
#include "ui/pointer_type.h"
#include "ui/timer.h"
#include "ui/widget.h"
@ -324,6 +325,7 @@ namespace app {
DocumentView* m_docView;
gfx::Point m_oldPos;
ui::PointerType m_lastPointerType;
EditorFlags m_flags;

View File

@ -1,5 +1,5 @@
// Aseprite
// Copyright (C) 2001-2015 David Capello
// Copyright (C) 2001-2016 David Capello
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2 as
@ -221,6 +221,7 @@ bool ToolBar::onProcessMessage(Message* msg)
MouseMessage* mouseMsg2 = new MouseMessage(
kMouseDownMessage,
mouseMsg->pointerType(),
mouseMsg->buttons(),
mouseMsg->modifiers(),
mouseMsg->position());
@ -635,6 +636,7 @@ bool ToolBar::ToolStrip::onProcessMessage(Message* msg)
MouseMessage* mouseMsg2 = new MouseMessage(
kMouseDownMessage,
mouseMsg->pointerType(),
mouseMsg->buttons(),
mouseMsg->modifiers(),
mouseMsg->position());

View File

@ -1,5 +1,5 @@
// Aseprite UI Library
// Copyright (C) 2001-2013, 2015 David Capello
// Copyright (C) 2001-2016 David Capello
//
// This file is released under the terms of the MIT license.
// Read LICENSE.txt for more information.
@ -481,6 +481,7 @@ bool ComboBoxEntry::onProcessMessage(Message* msg)
releaseMouse();
MouseMessage mouseMsg2(kMouseDownMessage,
mouseMsg->pointerType(),
mouseMsg->buttons(),
mouseMsg->modifiers(),
mouseMsg->position());

View File

@ -1,5 +1,5 @@
// Aseprite UI Library
// Copyright (C) 2001-2013, 2015 David Capello
// Copyright (C) 2001-2016 David Capello
//
// This file is released under the terms of the MIT license.
// Read LICENSE.txt for more information.
@ -90,6 +90,7 @@ bool IntEntry::onProcessMessage(Message* msg)
releaseMouse();
MouseMessage mouseMsg2(kMouseDownMessage,
mouseMsg->pointerType(),
mouseMsg->buttons(),
mouseMsg->modifiers(),
mouseMsg->position());

View File

@ -247,7 +247,8 @@ bool Manager::generateMessages()
}
void Manager::generateSetCursorMessage(const gfx::Point& mousePos,
KeyModifiers modifiers)
KeyModifiers modifiers,
PointerType pointerType)
{
if (get_mouse_cursor() == kOutsideDisplay)
return;
@ -257,7 +258,9 @@ void Manager::generateSetCursorMessage(const gfx::Point& mousePos,
enqueueMessage(
newMouseMessage(
kSetCursorMessage, dst,
mousePos, _internal_get_mouse_buttons(),
mousePos,
pointerType,
_internal_get_mouse_buttons(),
modifiers));
else
set_mouse_cursor(kArrowCursor);
@ -273,6 +276,18 @@ static MouseButtons mouse_buttons_from_she_to_ui(const she::Event& sheEvent)
}
}
static PointerType pointer_type_from_she_event(const she::Event& sheEvent)
{
switch (sheEvent.device()) {
case she::Event::MouseDevice: return PointerType::Mouse; break;
case she::Event::MultitouchDevice: return PointerType::Multitouch; break;
case she::Event::StylusDevice: return PointerType::Pen; break;
case she::Event::EraserDevice: return PointerType::Eraser; break;
default:
return PointerType::Unknown;
}
}
void Manager::generateMessagesFromSheEvents()
{
she::Event lastMouseMoveEvent;
@ -346,8 +361,11 @@ void Manager::generateMessagesFromSheEvents()
case she::Event::MouseMove: {
_internal_set_mouse_position(sheEvent.position());
handleMouseMove(sheEvent.position(), m_mouseButtons,
sheEvent.modifiers());
handleMouseMove(
sheEvent.position(),
m_mouseButtons,
sheEvent.modifiers(),
pointer_type_from_she_event(sheEvent));
lastMouseMoveEvent = sheEvent;
break;
}
@ -357,8 +375,11 @@ void Manager::generateMessagesFromSheEvents()
m_mouseButtons = (MouseButtons)((int)m_mouseButtons | (int)pressedButton);
_internal_set_mouse_buttons(m_mouseButtons);
handleMouseDown(sheEvent.position(), pressedButton,
sheEvent.modifiers());
handleMouseDown(
sheEvent.position(),
pressedButton,
sheEvent.modifiers(),
pointer_type_from_she_event(sheEvent));
break;
}
@ -367,21 +388,28 @@ void Manager::generateMessagesFromSheEvents()
m_mouseButtons = (MouseButtons)((int)m_mouseButtons & ~(int)releasedButton);
_internal_set_mouse_buttons(m_mouseButtons);
handleMouseUp(sheEvent.position(), releasedButton,
sheEvent.modifiers());
handleMouseUp(
sheEvent.position(),
releasedButton,
sheEvent.modifiers(),
pointer_type_from_she_event(sheEvent));
break;
}
case she::Event::MouseDoubleClick: {
MouseButtons clickedButton = mouse_buttons_from_she_to_ui(sheEvent);
handleMouseDoubleClick(sheEvent.position(), clickedButton,
sheEvent.modifiers());
handleMouseDoubleClick(
sheEvent.position(),
clickedButton,
sheEvent.modifiers(),
pointer_type_from_she_event(sheEvent));
break;
}
case she::Event::MouseWheel: {
handleMouseWheel(sheEvent.position(), m_mouseButtons,
sheEvent.modifiers(),
pointer_type_from_she_event(sheEvent),
sheEvent.wheelDelta(),
sheEvent.preciseWheel());
break;
@ -403,13 +431,15 @@ void Manager::generateMessagesFromSheEvents()
if (lastMouseMoveEvent.type() != she::Event::None) {
sheEvent = lastMouseMoveEvent;
generateSetCursorMessage(sheEvent.position(),
sheEvent.modifiers());
sheEvent.modifiers(),
pointer_type_from_she_event(sheEvent));
}
}
void Manager::handleMouseMove(const gfx::Point& mousePos,
MouseButtons mouseButtons,
KeyModifiers modifiers)
KeyModifiers modifiers,
PointerType pointerType)
{
// Get the list of widgets to send mouse messages.
mouse_widgets_list.clear();
@ -436,12 +466,16 @@ void Manager::handleMouseMove(const gfx::Point& mousePos,
enqueueMessage(
newMouseMessage(
kMouseMoveMessage, dst,
mousePos, mouseButtons, modifiers));
mousePos,
pointerType,
mouseButtons,
modifiers));
}
void Manager::handleMouseDown(const gfx::Point& mousePos,
MouseButtons mouseButtons,
KeyModifiers modifiers)
KeyModifiers modifiers,
PointerType pointerType)
{
handleWindowZOrder();
@ -449,41 +483,53 @@ void Manager::handleMouseDown(const gfx::Point& mousePos,
newMouseMessage(
kMouseDownMessage,
(capture_widget ? capture_widget: mouse_widget),
mousePos, mouseButtons, modifiers));
mousePos,
pointerType,
mouseButtons,
modifiers));
}
void Manager::handleMouseUp(const gfx::Point& mousePos,
MouseButtons mouseButtons,
KeyModifiers modifiers)
KeyModifiers modifiers,
PointerType pointerType)
{
enqueueMessage(
newMouseMessage(
kMouseUpMessage,
(capture_widget ? capture_widget: mouse_widget),
mousePos, mouseButtons, modifiers));
mousePos,
pointerType,
mouseButtons,
modifiers));
}
void Manager::handleMouseDoubleClick(const gfx::Point& mousePos,
MouseButtons mouseButtons,
KeyModifiers modifiers)
KeyModifiers modifiers,
PointerType pointerType)
{
Widget* dst = (capture_widget ? capture_widget: mouse_widget);
if (dst) {
enqueueMessage(
newMouseMessage(
kDoubleClickMessage,
dst, mousePos, mouseButtons, modifiers));
dst, mousePos, pointerType,
mouseButtons, modifiers));
}
}
void Manager::handleMouseWheel(const gfx::Point& mousePos,
MouseButtons mouseButtons, KeyModifiers modifiers,
const gfx::Point& wheelDelta, bool preciseWheel)
MouseButtons mouseButtons,
KeyModifiers modifiers,
PointerType pointerType,
const gfx::Point& wheelDelta,
bool preciseWheel)
{
enqueueMessage(newMouseMessage(
kMouseWheelMessage,
(capture_widget ? capture_widget: mouse_widget),
mousePos, mouseButtons, modifiers,
mousePos, pointerType, mouseButtons, modifiers,
wheelDelta, preciseWheel));
}
@ -776,7 +822,9 @@ void Manager::setMouse(Widget* widget)
Message* msg = newMouseMessage(
kMouseEnterMessage, NULL,
get_mouse_position(), _internal_get_mouse_buttons(),
get_mouse_position(),
PointerType::Unknown,
_internal_get_mouse_buttons(),
kKeyUninitializedModifier);
for (; it != widget_parents.end(); ++it) {
@ -786,7 +834,8 @@ void Manager::setMouse(Widget* widget)
enqueueMessage(msg);
generateSetCursorMessage(get_mouse_position(),
kKeyUninitializedModifier);
kKeyUninitializedModifier,
PointerType::Unknown);
}
}
}
@ -1419,12 +1468,16 @@ Widget* Manager::findMagneticWidget(Widget* widget)
// static
Message* Manager::newMouseMessage(
MessageType type,
Widget* widget, const gfx::Point& mousePos,
MouseButtons buttons, KeyModifiers modifiers,
const gfx::Point& wheelDelta, bool preciseWheel)
Widget* widget,
const gfx::Point& mousePos,
PointerType pointerType,
MouseButtons buttons,
KeyModifiers modifiers,
const gfx::Point& wheelDelta,
bool preciseWheel)
{
Message* msg = new MouseMessage(
type, buttons, modifiers, mousePos,
type, pointerType, buttons, modifiers, mousePos,
wheelDelta, preciseWheel);
if (widget != NULL)

View File

@ -12,6 +12,7 @@
#include "ui/keys.h"
#include "ui/message_type.h"
#include "ui/mouse_buttons.h"
#include "ui/pointer_type.h"
#include "ui/widget.h"
namespace she {
@ -115,14 +116,32 @@ namespace ui {
virtual void onNewDisplayConfiguration();
private:
void generateSetCursorMessage(const gfx::Point& mousePos, KeyModifiers modifiers);
void generateSetCursorMessage(const gfx::Point& mousePos,
KeyModifiers modifiers,
PointerType pointerType);
void generateMessagesFromSheEvents();
void handleMouseMove(const gfx::Point& mousePos, MouseButtons mouseButtons, KeyModifiers modifiers);
void handleMouseDown(const gfx::Point& mousePos, MouseButtons mouseButtons, KeyModifiers modifiers);
void handleMouseUp(const gfx::Point& mousePos, MouseButtons mouseButtons, KeyModifiers modifiers);
void handleMouseDoubleClick(const gfx::Point& mousePos, MouseButtons mouseButtons, KeyModifiers modifiers);
void handleMouseWheel(const gfx::Point& mousePos, MouseButtons mouseButtons, KeyModifiers modifiers,
const gfx::Point& wheelDelta, bool preciseWheel);
void handleMouseMove(const gfx::Point& mousePos,
MouseButtons mouseButtons,
KeyModifiers modifiers,
PointerType pointerType);
void handleMouseDown(const gfx::Point& mousePos,
MouseButtons mouseButtons,
KeyModifiers modifiers,
PointerType pointerType);
void handleMouseUp(const gfx::Point& mousePos,
MouseButtons mouseButtons,
KeyModifiers modifiers,
PointerType pointerType);
void handleMouseDoubleClick(const gfx::Point& mousePos,
MouseButtons mouseButtons,
KeyModifiers modifiers,
PointerType pointerType);
void handleMouseWheel(const gfx::Point& mousePos,
MouseButtons mouseButtons,
KeyModifiers modifiers,
PointerType pointerType,
const gfx::Point& wheelDelta,
bool preciseWheel);
void handleTouchMagnify(const gfx::Point& mousePos,
const KeyModifiers modifiers,
const double magnification);
@ -135,7 +154,9 @@ namespace ui {
static Message* newMouseMessage(
MessageType type,
Widget* widget, const gfx::Point& mousePos,
MouseButtons buttons, KeyModifiers modifiers,
PointerType pointerType,
MouseButtons buttons,
KeyModifiers modifiers,
const gfx::Point& wheelDelta = gfx::Point(0, 0),
bool preciseWheel = false);
void broadcastKeyMsg(Message* msg);

View File

@ -14,6 +14,7 @@
#include "ui/keys.h"
#include "ui/message_type.h"
#include "ui/mouse_buttons.h"
#include "ui/pointer_type.h"
#include "ui/widgets_list.h"
#include <string>
@ -103,18 +104,21 @@ namespace ui {
class MouseMessage : public Message {
public:
MouseMessage(MessageType type,
PointerType pointerType,
MouseButtons buttons,
KeyModifiers modifiers,
const gfx::Point& pos,
const gfx::Point& wheelDelta = gfx::Point(0, 0),
bool preciseWheel = false)
: Message(type, modifiers),
m_pointerType(pointerType),
m_buttons(buttons),
m_pos(pos),
m_wheelDelta(wheelDelta),
m_preciseWheel(preciseWheel) {
}
PointerType pointerType() const { return m_pointerType; }
MouseButtons buttons() const { return m_buttons; }
bool left() const { return (m_buttons & kButtonLeft) == kButtonLeft; }
bool right() const { return (m_buttons & kButtonRight) == kButtonRight; }
@ -125,6 +129,7 @@ namespace ui {
const gfx::Point& position() const { return m_pos; }
private:
PointerType m_pointerType;
MouseButtons m_buttons; // Pressed buttons
gfx::Point m_pos; // Mouse position
gfx::Point m_wheelDelta; // Wheel axis variation

23
src/ui/pointer_type.h Normal file
View File

@ -0,0 +1,23 @@
// Aseprite UI Library
// Copyright (C) 2016 David Capello
//
// This file is released under the terms of the MIT license.
// Read LICENSE.txt for more information.
#ifndef UI_POINTER_TYPE_H_INCLUDED
#define UI_POINTER_TYPE_H_INCLUDED
#pragma once
namespace ui {
enum class PointerType {
Unknown,
Mouse,
Multitouch,
Pen,
Eraser
};
} // namespace ui
#endif

View File

@ -1,5 +1,5 @@
// Aseprite UI Library
// Copyright (C) 2001-2013, 2015 David Capello
// Copyright (C) 2001-2016 David Capello
//
// This file is released under the terms of the MIT license.
// Read LICENSE.txt for more information.
@ -43,14 +43,15 @@
#include "ui/overlay_manager.h"
#include "ui/paint_event.h"
#include "ui/panel.h"
#include "ui/pointer_type.h"
#include "ui/popup_window.h"
#include "ui/size_hint_event.h"
#include "ui/property.h"
#include "ui/register_message.h"
#include "ui/resize_event.h"
#include "ui/save_layout_event.h"
#include "ui/scroll_bar.h"
#include "ui/separator.h"
#include "ui/size_hint_event.h"
#include "ui/slider.h"
#include "ui/splitter.h"
#include "ui/system.h"

View File

@ -1242,6 +1242,7 @@ bool Widget::offerCapture(ui::MouseMessage* mouseMsg, int widget_type)
MouseMessage* mouseMsg2 = new MouseMessage(
kMouseDownMessage,
mouseMsg->pointerType(),
mouseMsg->buttons(),
mouseMsg->modifiers(),
mouseMsg->position());
@ -1328,6 +1329,7 @@ bool Widget::onProcessMessage(Message* msg)
if (kMouseDownMessage) {
MouseMessage* mouseMsg = static_cast<MouseMessage*>(msg);
MouseMessage mouseMsg2(kMouseDownMessage,
mouseMsg->pointerType(),
mouseMsg->buttons(),
mouseMsg->modifiers(),
mouseMsg->position(),