Skip to content

Commit

Permalink
basic tablet/phone/watch autodetection
Browse files Browse the repository at this point in the history
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.

Heavily "inspired" by systemd way of handling detection.

Signed-off-by: David Heidelberg <[email protected]>
  • Loading branch information
okias committed Feb 22, 2024
1 parent 0d30a30 commit d565f4d
Showing 1 changed file with 69 additions and 25 deletions.
94 changes: 69 additions & 25 deletions src/defaultsettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,68 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "mapgen/mapgen.h" // Mapgen::setDefaultSettings
#include "util/string.h"



bool detect_touch()
{
#if ENABLE_TOUCH // Android & special builds
return true;
#else
std::string chassis_type;
#if defined(__linux__) || defined(__ANDROID__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__)
// 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 == "convertible" || // user has to set it by hand anyway
chassis_type == "desktop" ||
chassis_type == "laptop" ||
chassis_type == "server" ||
chassis_type == "embedded")
return false;

if (chassis_type == "tablet" ||
chassis_type == "handset" ||
chassis_type == "watch")
return true;

return false;
}
// SMBIOS (x86)
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;
}
#elif defined(_WIN32)
if (GetSystemMetrics(SM_TABLETPC))
return true;

return false;
#endif
// we don't know, return default
return false;
#endif
}

void set_default_settings()
{
Settings *settings = Settings::createLayer(SL_DEFAULTS);
Expand All @@ -39,11 +101,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(detect_touch()));
settings->setDefault("sound_volume", "0.8");
settings->setDefault("sound_volume_unfocused", "0.3");
settings->setDefault("mute_sound", "false");
Expand Down Expand Up @@ -95,12 +153,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", detect_touch() ? "KEY_KEY_R" : "");

settings->setDefault("keymap_freemove", "KEY_KEY_K");
settings->setDefault("keymap_pitchmove", "");
settings->setDefault("keymap_fastmove", "KEY_KEY_J");
Expand Down Expand Up @@ -197,11 +253,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(detect_touch()));
settings->setDefault("vsync", "false");
settings->setDefault("fov", "72");
settings->setDefault("leaves_style", "fancy");
Expand Down Expand Up @@ -307,11 +359,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(detect_touch()));
settings->setDefault("continuous_forward", "false");
settings->setDefault("enable_joysticks", "false");
settings->setDefault("joystick_id", "0");
Expand Down Expand Up @@ -491,11 +539,7 @@ void set_default_settings()
settings->setDefault("touch_use_crosshair", "false");
settings->setDefault("fixed_virtual_joystick", "false");
settings->setDefault("virtual_joystick_triggers_aux1", "false");
#ifdef ENABLE_TOUCH
settings->setDefault("clickable_chat_weblinks", "false");
#else
settings->setDefault("clickable_chat_weblinks", "true");
#endif
settings->setDefault("clickable_chat_weblinks", bool_to_cstr(!detect_touch()));
// Altered settings for Android
#ifdef __ANDROID__
settings->setDefault("screen_w", "0");
Expand Down

0 comments on commit d565f4d

Please sign in to comment.