mirror of
https://github.com/minetest/minetest.git
synced 2024-11-26 17:43:45 +01:00
Basic tablet/phone/watch autodetection (#14400)
Until we're able to detect touchscreen itself, let's have a detection based on a form factor of the device. Tablets and handhelds are usually equiped with touchscreens, so as a default enable touchscreen GUI there. - Windows and Linux supports autodetection. - Android is hardcoded as touch-based. - MacOS staying same as before without detection. Signed-off-by: David Heidelberg <david@ixit.cz>
This commit is contained in:
parent
de1d8ec070
commit
4ab3c54f5b
@ -12,7 +12,7 @@ android {
|
||||
cmake {
|
||||
arguments "-DANDROID_STL=c++_shared",
|
||||
"-DENABLE_CURL=1", "-DENABLE_SOUND=1",
|
||||
"-DENABLE_TOUCH=1", "-DENABLE_GETTEXT=1",
|
||||
"-DENABLE_GETTEXT=1",
|
||||
"-DBUILD_UNITTESTS=0", "-DENABLE_UPDATE_CHECKER=0"
|
||||
}
|
||||
}
|
||||
|
@ -38,7 +38,6 @@ General options and their default values:
|
||||
INSTALL_DEVTEST=FALSE - Whether the Development Test game should be installed alongside Minetest
|
||||
USE_GPROF=FALSE - Enable profiling using GProf
|
||||
VERSION_EXTRA= - Text to append to version (e.g. VERSION_EXTRA=foobar -> Minetest 0.4.9-foobar)
|
||||
ENABLE_TOUCH=FALSE - Enable touchscreen support by default (requires support by IrrlichtMt)
|
||||
|
||||
Library specific options:
|
||||
|
||||
|
@ -109,12 +109,6 @@ if(BUILD_CLIENT AND ENABLE_SOUND)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
option(ENABLE_TOUCH "Enable touchscreen by default" FALSE)
|
||||
if(ENABLE_TOUCH)
|
||||
message(STATUS "Touchscreen support enabled by default.")
|
||||
add_definitions(-DENABLE_TOUCH)
|
||||
endif()
|
||||
|
||||
if(BUILD_CLIENT)
|
||||
find_package(Freetype REQUIRED)
|
||||
endif()
|
||||
|
@ -26,9 +26,74 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
#include "mapgen/mapgen.h" // Mapgen::setDefaultSettings
|
||||
#include "util/string.h"
|
||||
|
||||
|
||||
/*
|
||||
* inspired by https://github.com/systemd/systemd/blob/7aed43437175623e0f3ae8b071bbc500c13ce893/src/hostname/hostnamed.c#L406
|
||||
* this could be done in future with D-Bus using query:
|
||||
* busctl get-property org.freedesktop.hostname1 /org/freedesktop/hostname1 org.freedesktop.hostname1 Chassis
|
||||
*/
|
||||
static bool detect_touch()
|
||||
{
|
||||
#if defined(__ANDROID__)
|
||||
return true;
|
||||
#elif defined(__linux__)
|
||||
std::string chassis_type;
|
||||
|
||||
// device-tree platforms (non-X86)
|
||||
std::ifstream dtb_file("/proc/device-tree/chassis-type");
|
||||
if (dtb_file.is_open()) {
|
||||
std::getline(dtb_file, chassis_type);
|
||||
chassis_type.pop_back();
|
||||
|
||||
if (chassis_type == "tablet" ||
|
||||
chassis_type == "handset" ||
|
||||
chassis_type == "watch")
|
||||
return true;
|
||||
|
||||
if (!chassis_type.empty())
|
||||
return false;
|
||||
}
|
||||
// SMBIOS
|
||||
std::ifstream dmi_file("/sys/class/dmi/id/chassis_type");
|
||||
if (dmi_file.is_open()) {
|
||||
std::getline(dmi_file, chassis_type);
|
||||
|
||||
if (chassis_type == "11" /* Handheld */ ||
|
||||
chassis_type == "30" /* Tablet */)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// ACPI-based platforms
|
||||
std::ifstream acpi_file("/sys/firmware/acpi/pm_profile");
|
||||
if (acpi_file.is_open()) {
|
||||
std::getline(acpi_file, chassis_type);
|
||||
|
||||
if (chassis_type == "8" /* Tablet */)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
#elif defined(_WIN32)
|
||||
// 0x01 The device has an integrated touch digitizer
|
||||
// 0x80 The device is ready to receive digitizer input.
|
||||
if ((GetSystemMetrics(SM_DIGITIZER) & 0x81) == 0x81)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
#else
|
||||
// we don't know, return default
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
void set_default_settings()
|
||||
{
|
||||
Settings *settings = Settings::createLayer(SL_DEFAULTS);
|
||||
bool has_touch = detect_touch();
|
||||
|
||||
// Client and server
|
||||
settings->setDefault("language", "");
|
||||
@ -39,11 +104,7 @@ void set_default_settings()
|
||||
// Client
|
||||
settings->setDefault("address", "");
|
||||
settings->setDefault("enable_sound", "true");
|
||||
#if ENABLE_TOUCH
|
||||
settings->setDefault("enable_touch", "true");
|
||||
#else
|
||||
settings->setDefault("enable_touch", "false");
|
||||
#endif
|
||||
settings->setDefault("enable_touch", bool_to_cstr(has_touch));
|
||||
settings->setDefault("sound_volume", "0.8");
|
||||
settings->setDefault("sound_volume_unfocused", "0.3");
|
||||
settings->setDefault("mute_sound", "false");
|
||||
@ -94,12 +155,10 @@ void set_default_settings()
|
||||
settings->setDefault("keymap_cmd_local", ".");
|
||||
settings->setDefault("keymap_minimap", "KEY_KEY_V");
|
||||
settings->setDefault("keymap_console", "KEY_F10");
|
||||
#if ENABLE_TOUCH
|
||||
|
||||
// See https://github.com/minetest/minetest/issues/12792
|
||||
settings->setDefault("keymap_rangeselect", "KEY_KEY_R");
|
||||
#else
|
||||
settings->setDefault("keymap_rangeselect", "");
|
||||
#endif
|
||||
settings->setDefault("keymap_rangeselect", has_touch ? "KEY_KEY_R" : "");
|
||||
|
||||
settings->setDefault("keymap_freemove", "KEY_KEY_K");
|
||||
settings->setDefault("keymap_pitchmove", "");
|
||||
settings->setDefault("keymap_fastmove", "KEY_KEY_J");
|
||||
@ -198,11 +257,7 @@ void set_default_settings()
|
||||
settings->setDefault("screen_h", "600");
|
||||
settings->setDefault("window_maximized", "false");
|
||||
settings->setDefault("autosave_screensize", "true");
|
||||
#ifdef ENABLE_TOUCH
|
||||
settings->setDefault("fullscreen", "true");
|
||||
#else
|
||||
settings->setDefault("fullscreen", "false");
|
||||
#endif
|
||||
settings->setDefault("fullscreen", bool_to_cstr(has_touch));
|
||||
settings->setDefault("vsync", "false");
|
||||
settings->setDefault("fov", "72");
|
||||
settings->setDefault("leaves_style", "fancy");
|
||||
@ -309,11 +364,7 @@ void set_default_settings()
|
||||
settings->setDefault("aux1_descends", "false");
|
||||
settings->setDefault("doubletap_jump", "false");
|
||||
settings->setDefault("always_fly_fast", "true");
|
||||
#ifdef ENABLE_TOUCH
|
||||
settings->setDefault("autojump", "true");
|
||||
#else
|
||||
settings->setDefault("autojump", "false");
|
||||
#endif
|
||||
settings->setDefault("autojump", bool_to_cstr(has_touch));
|
||||
settings->setDefault("continuous_forward", "false");
|
||||
settings->setDefault("enable_joysticks", "false");
|
||||
settings->setDefault("joystick_id", "0");
|
||||
@ -494,11 +545,7 @@ void set_default_settings()
|
||||
settings->setDefault("fixed_virtual_joystick", "false");
|
||||
settings->setDefault("virtual_joystick_triggers_aux1", "false");
|
||||
settings->setDefault("touch_punch_gesture", "short_tap");
|
||||
#ifdef ENABLE_TOUCH
|
||||
settings->setDefault("clickable_chat_weblinks", "false");
|
||||
#else
|
||||
settings->setDefault("clickable_chat_weblinks", "true");
|
||||
#endif
|
||||
// Altered settings for Android
|
||||
#ifdef __ANDROID__
|
||||
settings->setDefault("screen_w", "0");
|
||||
|
Loading…
Reference in New Issue
Block a user