[win] Add Tablet section on Edit > Preferences and restore old wintab behavior

Now on Windows it's more clear the different APIs to use (Windows
Pointer vs Wintab), the Wintab API works as before (generates mouse
events on WM_MOUSE message instead for each packet), and there is a
new Wintab mode to create events directly from packets (still a little
buggy with some tablets, but might be useful in other tablets to get
more precision for fast strokes).
This commit is contained in:
David Capello 2020-05-30 16:54:35 -03:00
parent b0d76d096f
commit 445e0abb0b
6 changed files with 132 additions and 20 deletions

View File

@ -184,6 +184,9 @@
<option id="font" type="std::string" /> <option id="font" type="std::string" />
<option id="mini_font" type="std::string" /> <option id="mini_font" type="std::string" />
</section> </section>
<section id="tablet" text="Tablet">
<option id="api" type="std::string" />
</section>
<section id="experimental" text="Experimental"> <section id="experimental" text="Experimental">
<option id="new_render_engine" type="bool" default="true" /> <option id="new_render_engine" type="bool" default="true" />
<option id="new_blend" type="bool" default="true" /> <option id="new_blend" type="bool" default="true" />

View File

@ -1010,6 +1010,7 @@ skip = &Skip
title = Preferences title = Preferences
section_general = General section_general = General
section_files = Files section_files = Files
section_tablet = Tablet
section_alerts = Alerts section_alerts = Alerts
section_color = Color section_color = Color
section_editor = Editor section_editor = Editor
@ -1089,6 +1090,9 @@ clear_recent_files = Clear
clear_recent_files_tooltip = Clear the list of recent files and folders clear_recent_files_tooltip = Clear the list of recent files and folders
locate_file = Locate Configuration File locate_file = Locate Configuration File
locate_crash_folder = Locate Crash Folder locate_crash_folder = Locate Crash Folder
tablet_api_windows_pointer = Windows 8/10 Pointer API (Windows Ink)
tablet_api_wintab_system = Wintab
tablet_api_wintab_direct = Wintab (direct packet processing)
wheel_zoom = Zoom with scroll wheel wheel_zoom = Zoom with scroll wheel
slide_zoom = Zoom sliding two fingers up or down slide_zoom = Zoom sliding two fingers up or down
zoom_from_center_with_wheel = Zoom from center with scroll wheel zoom_from_center_with_wheel = Zoom from center with scroll wheel
@ -1256,12 +1260,9 @@ native_clipboard = Use native clipboard
native_file_dialog = Use native file dialog native_file_dialog = Use native file dialog
one_finger_as_mouse_movement = Interpret one finger as mouse movement one_finger_as_mouse_movement = Interpret one finger as mouse movement
one_finger_as_mouse_movement_tooltip = <<<END one_finger_as_mouse_movement_tooltip = <<<END
Only for Windows 8/10 tablets: Interprets one finger as mouse movement Only for Windows 8/10 Pointer API: Interprets one finger as mouse movement
and two fingers as pan/scroll. Uncheck this to use the old behavior: and two fingers as pan/scroll. Uncheck this to use the old behavior:
One finger pans/scrolls. One finger pans/scrolls.
--
Note: This option is available just to get the old behavior but
will be removed in future versions.
END END
load_wintab_driver = Load wintab32 library load_wintab_driver = Load wintab32 library
load_wintab_driver_tooltip = <<<END load_wintab_driver_tooltip = <<<END

View File

@ -8,6 +8,7 @@
<view maxsize="true"> <view maxsize="true">
<listbox id="section_listbox"> <listbox id="section_listbox">
<listitem text="@.section_general" value="section_general" /> <listitem text="@.section_general" value="section_general" />
<listitem text="@.section_tablet" value="section_tablet" />
<listitem text="@.section_files" value="section_files" /> <listitem text="@.section_files" value="section_files" />
<listitem text="@.section_color" value="section_color" /> <listitem text="@.section_color" value="section_color" />
<listitem text="@.section_alerts" value="section_alerts" /> <listitem text="@.section_alerts" value="section_alerts" />
@ -73,6 +74,25 @@
<link id="locate_crash_folder" text="@.locate_crash_folder" /> <link id="locate_crash_folder" text="@.locate_crash_folder" />
</vbox> </vbox>
<!-- Tablet -->
<vbox id="section_tablet">
<separator text="@.section_tablet" horizontal="true" />
<radio id="tablet_api_windows_pointer" text="@.tablet_api_windows_pointer" group="1" />
<radio id="tablet_api_wintab_system" text="@.tablet_api_wintab_system" group="1" />
<radio id="tablet_api_wintab_direct" text="@.tablet_api_wintab_direct" group="1" />
<separator horizontal="true" />
<check id="one_finger_as_mouse_movement"
text="@.one_finger_as_mouse_movement"
tooltip="@.one_finger_as_mouse_movement_tooltip"
pref="experimental.one_finger_as_mouse_movement" />
<hbox>
<check id="load_wintab_driver"
text="@.load_wintab_driver"
tooltip="@.load_wintab_driver_tooltip" />
<link text="@.wintab_more_info" url="https://www.aseprite.org/docs/wintab/" />
</hbox>
</vbox>
<!-- Files --> <!-- Files -->
<vbox id="section_files"> <vbox id="section_files">
<separator text="@.section_files" horizontal="true" /> <separator text="@.section_files" horizontal="true" />
@ -473,15 +493,10 @@
</hbox> </hbox>
<check id="native_clipboard" text="@.native_clipboard" /> <check id="native_clipboard" text="@.native_clipboard" />
<check id="native_file_dialog" text="@.native_file_dialog" /> <check id="native_file_dialog" text="@.native_file_dialog" />
<check id="one_finger_as_mouse_movement"
text="@.one_finger_as_mouse_movement"
tooltip="@.one_finger_as_mouse_movement_tooltip"
pref="experimental.one_finger_as_mouse_movement" />
<hbox id="load_wintab_driver_box"> <hbox id="load_wintab_driver_box">
<check id="load_wintab_driver" <check id="load_wintab_driver2"
text="@.load_wintab_driver" text="@.load_wintab_driver"
tooltip="@.load_wintab_driver_tooltip" tooltip="@.load_wintab_driver_tooltip" />
pref="experimental.load_wintab_driver" />
<link text="@.wintab_more_info" url="https://www.aseprite.org/docs/wintab/" /> <link text="@.wintab_more_info" url="https://www.aseprite.org/docs/wintab/" />
</hbox> </hbox>
<check id="flash_layer" text="@.flash_selected_layer" /> <check id="flash_layer" text="@.flash_selected_layer" />

2
laf

@ -1 +1 @@
Subproject commit 682695222963087539541acd636096b6aefd2c8e Subproject commit af0f8e7b53b9e3e689b5fa4e5ce1466c42c9e2aa

View File

@ -229,9 +229,14 @@ int App::initialize(const AppOptions& options)
#ifdef _WIN32 #ifdef _WIN32
if (options.disableWintab() || if (options.disableWintab() ||
!preferences().experimental.loadWintabDriver()) { !preferences().experimental.loadWintabDriver() ||
system->useWintabAPI(false); preferences().tablet.api() == "pointer") {
system->setTabletAPI(os::TabletAPI::WindowsPointerInput);
} }
else if (preferences().tablet.api() == "wintab_packets")
system->setTabletAPI(os::TabletAPI::WintabPackets);
else // preferences().tablet.api() == "wintab"
system->setTabletAPI(os::TabletAPI::Wintab);
#endif #endif
system->setAppName(get_app_name()); system->setAppName(get_app_name());

View File

@ -50,6 +50,7 @@ namespace app {
namespace { namespace {
const char* kSectionGeneralId = "section_general"; const char* kSectionGeneralId = "section_general";
const char* kSectionTabletId = "section_tablet";
const char* kSectionBgId = "section_bg"; const char* kSectionBgId = "section_bg";
const char* kSectionGridId = "section_grid"; const char* kSectionGridId = "section_grid";
const char* kSectionThemeId = "section_theme"; const char* kSectionThemeId = "section_theme";
@ -351,9 +352,47 @@ public:
if (m_pref.experimental.useNativeFileDialog()) if (m_pref.experimental.useNativeFileDialog())
nativeFileDialog()->setSelected(true); nativeFileDialog()->setSelected(true);
#ifndef _WIN32 #ifdef _WIN32 // Show Tablet section on Windows
oneFingerAsMouseMovement()->setVisible(false); {
loadWintabDriverBox()->setVisible(false); os::TabletAPI tabletAPI = os::instance()->tabletAPI();
if (tabletAPI == os::TabletAPI::Wintab) {
tabletApiWintabSystem()->setSelected(true);
loadWintabDriver()->setSelected(true);
loadWintabDriver2()->setSelected(true);
}
else if (tabletAPI == os::TabletAPI::WintabPackets) {
tabletApiWintabDirect()->setSelected(true);
loadWintabDriver()->setSelected(true);
loadWintabDriver2()->setSelected(true);
}
else {
tabletApiWindowsPointer()->setSelected(true);
loadWintabDriver()->setSelected(false);
loadWintabDriver2()->setSelected(false);
}
tabletApiWindowsPointer()->Click.connect([this](Event&){ onTabletAPIChange(); });
tabletApiWintabSystem()->Click.connect([this](Event&){ onTabletAPIChange(); });
tabletApiWintabDirect()->Click.connect([this](Event&){ onTabletAPIChange(); });
loadWintabDriver()->Click.connect(
[this](Event&){ onLoadWintabChange(loadWintabDriver()->isSelected()); });
loadWintabDriver2()->Click.connect(
[this](Event&){ onLoadWintabChange(loadWintabDriver2()->isSelected()); });
}
#else // For macOS and Linux
{
// Hide the "section_tablet" item (which is only for Windows at the moment)
for (auto item : sectionListbox()->children()) {
if (static_cast<ListItem*>(item)->getValue() == kSectionTabletId) {
item->setVisible(false);
break;
}
}
sectionTablet()->setVisible(false);
loadWintabDriverBox()->setVisible(false);
loadWintabDriverBox()->setVisible(false);
}
#endif #endif
if (m_pref.experimental.flashLayer()) if (m_pref.experimental.flashLayer())
@ -658,9 +697,35 @@ public:
m_pref.experimental.nonactiveLayersOpacity(nonactiveLayersOpacity()->getValue()); m_pref.experimental.nonactiveLayersOpacity(nonactiveLayersOpacity()->getValue());
#ifdef _WIN32 #ifdef _WIN32
manager()->getDisplay() {
->setInterpretOneFingerGestureAsMouseMovement( os::TabletAPI tabletAPI = os::TabletAPI::Default;
oneFingerAsMouseMovement()->isSelected()); std::string tabletStr;
bool wintabState = false;
if (tabletApiWindowsPointer()->isSelected()) {
tabletAPI = os::TabletAPI::WindowsPointerInput;
tabletStr = "pointer";
}
else if (tabletApiWintabSystem()->isSelected()) {
tabletAPI = os::TabletAPI::Wintab;
tabletStr = "wintab";
wintabState = true;
}
else if (tabletApiWintabDirect()->isSelected()) {
tabletAPI = os::TabletAPI::WintabPackets;
tabletStr = "wintab_packets";
wintabState = true;
}
m_pref.tablet.api(tabletStr);
m_pref.experimental.loadWintabDriver(wintabState);
manager()->getDisplay()
->setInterpretOneFingerGestureAsMouseMovement(
oneFingerAsMouseMovement()->isSelected());
os::instance()->setTabletAPI(tabletAPI);
}
#endif #endif
ui::set_use_native_cursors(m_pref.cursor.useNativeCursor()); ui::set_use_native_cursors(m_pref.cursor.useNativeCursor());
@ -1505,6 +1570,29 @@ private:
} }
} }
#ifdef _WIN32
void onTabletAPIChange() {
if (tabletApiWindowsPointer()->isSelected()) {
loadWintabDriver()->setSelected(false);
loadWintabDriver2()->setSelected(false);
}
else if (tabletApiWintabSystem()->isSelected() ||
tabletApiWintabDirect()->isSelected()) {
loadWintabDriver()->setSelected(true);
loadWintabDriver2()->setSelected(true);
}
}
void onLoadWintabChange(bool state) {
loadWintabDriver()->setSelected(state);
loadWintabDriver2()->setSelected(state);
if (state)
tabletApiWintabSystem()->setSelected(true);
else
tabletApiWindowsPointer()->setSelected(true);
}
#endif // _WIN32
Context* m_context; Context* m_context;
Preferences& m_pref; Preferences& m_pref;
DocumentPreferences& m_globPref; DocumentPreferences& m_globPref;