summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--data.cpp13
-rw-r--r--data.hpp1
-rw-r--r--fixPermissions.cpp33
-rw-r--r--fixPermissions.hpp5
-rw-r--r--gui/Android.mk3
-rw-r--r--gui/action.cpp6
-rw-r--r--gui/button.cpp2
-rw-r--r--gui/devices/1024x600/res/images/cursor.pngbin0 -> 1452 bytes
-rwxr-xr-xgui/devices/1024x600/res/ui.xml74
-rw-r--r--gui/devices/1024x768/res/images/cursor.pngbin0 -> 1452 bytes
-rw-r--r--gui/devices/1024x768/res/ui.xml74
-rw-r--r--gui/devices/1080x1920/res/images/cursor.pngbin0 -> 1452 bytes
-rw-r--r--gui/devices/1080x1920/res/ui.xml64
-rw-r--r--gui/devices/1200x1920/res/images/cursor.pngbin0 -> 1452 bytes
-rw-r--r--gui/devices/1200x1920/res/ui.xml64
-rw-r--r--gui/devices/1280x800/res/images/cursor.pngbin0 -> 1452 bytes
-rw-r--r--gui/devices/1280x800/res/ui.xml74
-rw-r--r--gui/devices/1920x1200/res/images/cursor.pngbin0 -> 1452 bytes
-rw-r--r--gui/devices/1920x1200/res/ui.xml74
-rw-r--r--gui/devices/2560x1600/res/images/cursor.pngbin0 -> 1452 bytes
-rw-r--r--gui/devices/2560x1600/res/ui.xml74
-rw-r--r--gui/devices/320x480/res/images/cursor.pngbin0 -> 1452 bytes
-rw-r--r--gui/devices/320x480/res/ui.xml64
-rw-r--r--gui/devices/480x800/res/images/cursor.pngbin0 -> 1452 bytes
-rw-r--r--gui/devices/480x800/res/ui.xml64
-rw-r--r--gui/devices/480x854/res/images/cursor.pngbin0 -> 1452 bytes
-rw-r--r--gui/devices/480x854/res/ui.xml64
-rw-r--r--gui/devices/540x960/res/images/cursor.pngbin0 -> 1452 bytes
-rw-r--r--gui/devices/540x960/res/ui.xml64
-rw-r--r--gui/devices/720x1280/res/images/cursor.pngbin0 -> 1452 bytes
-rw-r--r--gui/devices/720x1280/res/ui.xml64
-rw-r--r--gui/devices/800x1280/res/images/cursor.pngbin0 -> 1452 bytes
-rwxr-xr-xgui/devices/800x1280/res/ui.xml64
-rw-r--r--gui/devices/800x480/res/images/cursor.pngbin0 -> 1452 bytes
-rwxr-xr-xgui/devices/800x480/res/ui.xml74
-rw-r--r--gui/gui.cpp90
-rw-r--r--gui/keyboard.cpp3
-rw-r--r--gui/mousecursor.cpp154
-rw-r--r--gui/objects.hpp27
-rw-r--r--gui/pages.cpp40
-rw-r--r--gui/pages.hpp5
-rw-r--r--gui/slider.cpp5
-rw-r--r--libtar/extract.c5
-rw-r--r--libtar/wrapper.c6
-rw-r--r--minuitwrp/events.c80
-rw-r--r--minuitwrp/minui.h3
-rw-r--r--partition.cpp15
-rw-r--r--twrp-functions.cpp6
-rw-r--r--twrp-functions.hpp1
49 files changed, 1391 insertions, 68 deletions
diff --git a/data.cpp b/data.cpp
index c611e78fa..230ac73e6 100644
--- a/data.cpp
+++ b/data.cpp
@@ -55,7 +55,7 @@ extern "C"
#include "twcommon.h"
#include "data.h"
#include "gui/pages.h"
-
+ #include "minuitwrp/minui.h"
void gui_notifyVarChange(const char *name, const char* value);
}
@@ -583,6 +583,9 @@ void DataManager::SetDefaultValues()
mConstValues.insert(make_pair(TW_VERSION_VAR, TW_VERSION_STR));
mValues.insert(make_pair("tw_storage_path", make_pair("/", 1)));
+ mValues.insert(make_pair("tw_button_vibrate", make_pair("80", 1)));
+ mValues.insert(make_pair("tw_keyboard_vibrate", make_pair("40", 1)));
+ mValues.insert(make_pair("tw_action_vibrate", make_pair("160", 1)));
#ifdef TW_FORCE_CPUINFO_FOR_DEVICE_ID
printf("TW_FORCE_CPUINFO_FOR_DEVICE_ID := true\n");
@@ -1240,3 +1243,11 @@ extern "C" void DataManager_ReadSettingsFile(void)
{
return DataManager::ReadSettingsFile();
}
+void DataManager::Vibrate(const string varName)
+{
+ int vib_value = 0;
+ GetValue(varName, vib_value);
+ if (vib_value) {
+ vibrate(vib_value);
+ }
+}
diff --git a/data.hpp b/data.hpp
index 723cf9b12..df57f234a 100644
--- a/data.hpp
+++ b/data.hpp
@@ -55,6 +55,7 @@ public:
static void DumpValues();
static void update_tz_environment_variables();
+ static void Vibrate(const string varName);
static void SetBackupFolder();
static void SetDefaultValues();
static void Output_Version(void); // Outputs the version to a file in the TWRP folder
diff --git a/fixPermissions.cpp b/fixPermissions.cpp
index 40ac516b0..12ce0b528 100644
--- a/fixPermissions.cpp
+++ b/fixPermissions.cpp
@@ -74,18 +74,48 @@ int fixPermissions::fixDataDataContexts(void) {
struct selinux_opt selinux_options[] = {
{ SELABEL_OPT_PATH, "/file_contexts" }
};
+
selinux_handle = selabel_open(SELABEL_CTX_FILE, selinux_options, 1);
+
if (!selinux_handle)
printf("No file contexts for SELinux\n");
else
printf("SELinux contexts loaded from /file_contexts\n");
+
d = opendir("/data/data");
+
while (( de = readdir(d)) != NULL) {
stat(de->d_name, &sb);
string f = "/data/data/";
f = f + de->d_name;
restorecon(f, &sb);
}
+ closedir(d);
+ return 0;
+}
+
+int fixPermissions::fixDataInternalContexts(void) {
+ DIR *d;
+ struct dirent *de;
+ struct stat sb;
+ string dir;
+
+ if (TWFunc::Path_Exists("/data/media")) {
+ dir = "/data/media";
+ }
+ else {
+ dir = "/data/media/0";
+ }
+ LOGINFO("Fixing %s contexts\n", dir.c_str());
+ d = opendir(dir.c_str());
+
+ while (( de = readdir(d)) != NULL) {
+ stat(de->d_name, &sb);
+ string f;
+ f = dir + de->d_name;
+ restorecon(f, &sb);
+ }
+ closedir(d);
return 0;
}
#endif
@@ -173,8 +203,9 @@ int fixPermissions::fixPerms(bool enable_debug, bool remove_data_for_missing_app
}
}
#ifdef HAVE_SELINUX
- gui_print("Fixing /data/data contexts.\n");
+ gui_print("Fixing /data/data/ contexts.\n");
fixDataDataContexts();
+ fixDataInternalContexts();
#endif
gui_print("Done fixing permissions.\n");
return 0;
diff --git a/fixPermissions.hpp b/fixPermissions.hpp
index 6439dac60..48a52074e 100644
--- a/fixPermissions.hpp
+++ b/fixPermissions.hpp
@@ -17,6 +17,7 @@ using namespace std;
class fixPermissions {
public:
int fixPerms(bool enable_debug, bool remove_data_for_missing_apps);
+ int fixDataInternalContexts(void);
private:
int pchown(std::string fn, int puid, int pgid);
@@ -28,8 +29,8 @@ class fixPermissions {
int fixDataApps();
int fixAllFiles(string directory, int gid, int uid, string file_perms);
int fixDataData(string dataDir);
- int fixDataDataContexts(void);
int restorecon(std::string entry, struct stat *sb);
+ int fixDataDataContexts(void);
struct package {
string pkgName;
@@ -45,6 +46,6 @@ class fixPermissions {
bool remove_data;
bool multi_user;
package* head;
- package* temp;
+ package* temp;
string packageFile;
};
diff --git a/gui/Android.mk b/gui/Android.mk
index ac0b2037c..29d99f7f8 100644
--- a/gui/Android.mk
+++ b/gui/Android.mk
@@ -22,7 +22,8 @@ LOCAL_SRC_FILES := \
keyboard.cpp \
input.cpp \
blanktimer.cpp \
- partitionlist.cpp
+ partitionlist.cpp \
+ mousecursor.cpp
ifneq ($(TWRP_CUSTOM_KEYBOARD),)
LOCAL_SRC_FILES += $(TWRP_CUSTOM_KEYBOARD)
diff --git a/gui/action.cpp b/gui/action.cpp
index 5536c82b1..9c785d169 100644
--- a/gui/action.cpp
+++ b/gui/action.cpp
@@ -314,6 +314,7 @@ void* GUIAction::thread_start(void *cookie)
void GUIAction::operation_start(const string operation_name)
{
+ time(&Start);
DataManager::SetValue(TW_ACTION_BUSY, 1);
DataManager::SetValue("ui_progress", 0);
DataManager::SetValue("tw_operation", operation_name);
@@ -323,6 +324,7 @@ void GUIAction::operation_start(const string operation_name)
void GUIAction::operation_end(const int operation_status, const int simulate)
{
+ time_t Stop;
int simulate_fail;
DataManager::SetValue("ui_progress", 100);
if (simulate) {
@@ -344,6 +346,9 @@ void GUIAction::operation_end(const int operation_status, const int simulate)
#ifndef TW_NO_SCREEN_TIMEOUT
blankTimer.resetTimerAndUnblank();
#endif
+ time(&Stop);
+ if ((int) difftime(Stop, Start) > 10)
+ DataManager::Vibrate("tw_action_vibrate");
}
int GUIAction::doAction(Action action, int isThreaded /* = 0 */)
@@ -920,6 +925,7 @@ int GUIAction::doAction(Action action, int isThreaded /* = 0 */)
else {
operation_end(1, simulate);
return -1;
+
}
DataManager::SetValue(TW_BACKUP_NAME, "(Auto Generate)");
} else if (arg == "restore") {
diff --git a/gui/button.cpp b/gui/button.cpp
index be52c277e..b14e6754c 100644
--- a/gui/button.cpp
+++ b/gui/button.cpp
@@ -30,6 +30,7 @@
#include <time.h>
#include <unistd.h>
#include <stdlib.h>
+#include "../data.hpp"
#include <string>
@@ -280,6 +281,7 @@ int GUIButton::NotifyTouch(TOUCH_STATE state, int x, int y)
} else {
if (last_state == 0) {
last_state = 1;
+ DataManager::Vibrate("tw_button_vibrate");
if (mButtonLabel != NULL)
mButtonLabel->isHighlighted = true;
if (mButtonImg != NULL)
diff --git a/gui/devices/1024x600/res/images/cursor.png b/gui/devices/1024x600/res/images/cursor.png
new file mode 100644
index 000000000..32c8ae1ca
--- /dev/null
+++ b/gui/devices/1024x600/res/images/cursor.png
Binary files differ
diff --git a/gui/devices/1024x600/res/ui.xml b/gui/devices/1024x600/res/ui.xml
index 569a5bd1f..4597fb3a3 100755
--- a/gui/devices/1024x600/res/ui.xml
+++ b/gui/devices/1024x600/res/ui.xml
@@ -38,6 +38,7 @@
<resource name="keyboard2" type="image" filename="keyboard2" />
<resource name="keyboard3" type="image" filename="keyboard3" />
<resource name="keyboard4" type="image" filename="keyboard4" />
+ <resource name="cursor" type="image" filename="cursor" />
</resources>
<variables>
@@ -205,6 +206,12 @@
<variable name="slidervalue_sliderh" value="50" />
</variables>
+ <mousecursor>
+ <placement w="15" h="15" />
+ <background color="#FFFF00FF" resource="cursor" />
+ <speed multiplier="2" />
+ </mousecursor>
+
<templates>
<template name="header">
<background color="#000000FF" />
@@ -2430,20 +2437,29 @@
<object type="button">
<highlight color="%highlight_color%" />
- <placement x="%col4_x%" y="%row2_y%" />
+ <placement x="%col2_x%" y="%row2_y%" />
<font resource="font" color="%button_text_color%" />
- <text>Screen</text>
+ <text>Restore Defaults</text>
<image resource="main_button" />
- <action function="page">screen</action>
+ <action function="restoredefaultsettings"></action>
</object>
<object type="button">
<highlight color="%highlight_color%" />
- <placement x="%col_center_x%" y="%slider_y%" />
+ <placement x="%col3_x%" y="%row2_y%" />
<font resource="font" color="%button_text_color%" />
- <text>Restore Defaults</text>
+ <text>Vibration Duration</text>
<image resource="main_button" />
- <action function="restoredefaultsettings"></action>
+ <action function="page">Vibrate</action>
+ </object>
+
+ <object type="button">
+ <highlight color="%highlight_color%" />
+ <placement x="%col4_x%" y="%row2_y%" />
+ <font resource="font" color="%button_text_color%" />
+ <text>Screen</text>
+ <image resource="main_button" />
+ <action function="page">screen</action>
</object>
<object type="action">
@@ -2652,6 +2668,52 @@
<object type="template" name="footer" />
</page>
+ <page name="Vibrate">
+ <object type="template" name="header" />
+
+ <object type="text" color="%text_color%">
+ <font resource="font" />
+ <placement x="%center_x%" y="%row1_text_y%" placement="5" />
+ <text>Vibration Settings :</text>
+ </object>
+
+ <object type="slidervalue">
+ <placement x="slidervalue_x" y="%row3_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Button Vibration:</text>
+ <data variable="tw_button_vibrate" min="0" max="300" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="slidervalue">
+ <placement x="slidervalue_x" y="%row7_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Keyboard Vibration:</text>
+ <data variable="tw_keyboard_vibrate" min="0" max="300" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="slidervalue">
+ <placement x="slidervalue_x" y="%row11_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Action Vibration:</text>
+ <data variable="tw_action_vibrate" min="0" max="500" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="action">
+ <touch key="home" />
+ <action function="page">main</action>
+ </object>
+
+ <object type="action">
+ <touch key="back" />
+ <action function="page">settings</action>
+ </object>
+
+ <object type="template" name="footer" />
+ </page>
+
<page name="advanced">
<object type="template" name="header" />
diff --git a/gui/devices/1024x768/res/images/cursor.png b/gui/devices/1024x768/res/images/cursor.png
new file mode 100644
index 000000000..32c8ae1ca
--- /dev/null
+++ b/gui/devices/1024x768/res/images/cursor.png
Binary files differ
diff --git a/gui/devices/1024x768/res/ui.xml b/gui/devices/1024x768/res/ui.xml
index 6f8797a74..84f470298 100644
--- a/gui/devices/1024x768/res/ui.xml
+++ b/gui/devices/1024x768/res/ui.xml
@@ -38,6 +38,7 @@
<resource name="keyboard2" type="image" filename="keyboard2" />
<resource name="keyboard3" type="image" filename="keyboard3" />
<resource name="keyboard4" type="image" filename="keyboard4" />
+ <resource name="cursor" type="image" filename="cursor" />
</resources>
<variables>
@@ -205,6 +206,12 @@
<variable name="slidervalue_sliderh" value="50" />
</variables>
+ <mousecursor>
+ <placement w="15" h="15" />
+ <background color="#FFFF00FF" resource="cursor" />
+ <speed multiplier="2" />
+ </mousecursor>
+
<templates>
<template name="header">
<background color="#000000FF" />
@@ -2430,20 +2437,29 @@
<object type="button">
<highlight color="%highlight_color%" />
- <placement x="%col4_x%" y="%row2_y%" />
+ <placement x="%col2_x%" y="%row2_y%" />
<font resource="font" color="%button_text_color%" />
- <text>Screen</text>
+ <text>Restore Defaults</text>
<image resource="main_button" />
- <action function="page">screen</action>
+ <action function="restoredefaultsettings"></action>
</object>
<object type="button">
<highlight color="%highlight_color%" />
- <placement x="%col_center_x%" y="%slider_y%" />
+ <placement x="%col3_x%" y="%row2_y%" />
<font resource="font" color="%button_text_color%" />
- <text>Restore Defaults</text>
+ <text>Vibration Duration</text>
<image resource="main_button" />
- <action function="restoredefaultsettings"></action>
+ <action function="page">Vibrate</action>
+ </object>
+
+ <object type="button">
+ <highlight color="%highlight_color%" />
+ <placement x="%col4_x%" y="%row2_y%" />
+ <font resource="font" color="%button_text_color%" />
+ <text>Screen</text>
+ <image resource="main_button" />
+ <action function="page">screen</action>
</object>
<object type="action">
@@ -2652,6 +2668,52 @@
<object type="template" name="footer" />
</page>
+ <page name="Vibrate">
+ <object type="template" name="header" />
+
+ <object type="text" color="%text_color%">
+ <font resource="font" />
+ <placement x="%center_x%" y="%row1_text_y%" placement="5" />
+ <text>Vibration Settings :</text>
+ </object>
+
+ <object type="slidervalue">
+ <placement x="slidervalue_x" y="%row3_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Button Vibration:</text>
+ <data variable="tw_button_vibrate" min="0" max="300" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="slidervalue">
+ <placement x="slidervalue_x" y="%row7_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Keyboard Vibration:</text>
+ <data variable="tw_keyboard_vibrate" min="0" max="300" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="slidervalue">
+ <placement x="slidervalue_x" y="%row11_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Action Vibration:</text>
+ <data variable="tw_action_vibrate" min="0" max="500" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="action">
+ <touch key="home" />
+ <action function="page">main</action>
+ </object>
+
+ <object type="action">
+ <touch key="back" />
+ <action function="page">settings</action>
+ </object>
+
+ <object type="template" name="footer" />
+ </page>
+
<page name="advanced">
<object type="template" name="header" />
diff --git a/gui/devices/1080x1920/res/images/cursor.png b/gui/devices/1080x1920/res/images/cursor.png
new file mode 100644
index 000000000..32c8ae1ca
--- /dev/null
+++ b/gui/devices/1080x1920/res/images/cursor.png
Binary files differ
diff --git a/gui/devices/1080x1920/res/ui.xml b/gui/devices/1080x1920/res/ui.xml
index beaf37325..3ab69a6ed 100644
--- a/gui/devices/1080x1920/res/ui.xml
+++ b/gui/devices/1080x1920/res/ui.xml
@@ -39,6 +39,7 @@
<resource name="keyboard2" type="image" filename="keyboard2" />
<resource name="keyboard3" type="image" filename="keyboard3" />
<resource name="keyboard4" type="image" filename="keyboard4" />
+ <resource name="cursor" type="image" filename="cursor" />
</resources>
<variables>
@@ -191,6 +192,12 @@
<variable name="slidervalue_sliderh" value="90" />
</variables>
+ <mousecursor>
+ <placement w="15" h="15" />
+ <background color="#FFFF00FF" resource="cursor" />
+ <speed multiplier="2.5" />
+ </mousecursor>
+
<templates>
<template name="header">
<background color="#000000FF" />
@@ -2456,7 +2463,16 @@
</object>
<object type="button">
- <placement x="%col_center_x%" y="%row4_y%" />
+ <highlight color="%highlight_color%" />
+ <placement x="%col2_x%" y="%row4_y%" />
+ <font resource="font" color="%button_text_color%" />
+ <text>Vibration Duration</text>
+ <image resource="main_button" />
+ <action function="page">Vibrate</action>
+ </object>
+
+ <object type="button">
+ <placement x="%col_x%" y="%row4_y%" />
<font resource="font" color="%button_text_color%" />
<text>Restore Defaults</text>
<image resource="main_button" />
@@ -2663,6 +2679,52 @@
<object type="template" name="footer" />
</page>
+ <page name="Vibrate">
+ <object type="template" name="header" />
+
+ <object type="text" color="%text_color%">
+ <font resource="font" />
+ <placement x="%center_x%" y="%row1_header_y%" placement="5" />
+ <text>Vibration Settings :</text>
+ </object>
+
+ <object type="slidervalue">
+ <placement x="col1_x" y="%row4_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Button Vibration:</text>
+ <data variable="tw_button_vibrate" min="0" max="300" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="slidervalue">
+ <placement x="col1_x" y="%row8_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Keyboard Vibration:</text>
+ <data variable="tw_keyboard_vibrate" min="0" max="300" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="slidervalue">
+ <placement x="col1_x" y="%row12_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Action Vibration:</text>
+ <data variable="tw_action_vibrate" min="0" max="500" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="action">
+ <touch key="home" />
+ <action function="page">main</action>
+ </object>
+
+ <object type="action">
+ <touch key="back" />
+ <action function="page">settings</action>
+ </object>
+
+ <object type="template" name="footer" />
+ </page>
+
<page name="advanced">
<object type="template" name="header" />
diff --git a/gui/devices/1200x1920/res/images/cursor.png b/gui/devices/1200x1920/res/images/cursor.png
new file mode 100644
index 000000000..32c8ae1ca
--- /dev/null
+++ b/gui/devices/1200x1920/res/images/cursor.png
Binary files differ
diff --git a/gui/devices/1200x1920/res/ui.xml b/gui/devices/1200x1920/res/ui.xml
index a83c30bb7..5aedca8b1 100644
--- a/gui/devices/1200x1920/res/ui.xml
+++ b/gui/devices/1200x1920/res/ui.xml
@@ -39,6 +39,7 @@
<resource name="keyboard2" type="image" filename="keyboard2" />
<resource name="keyboard3" type="image" filename="keyboard3" />
<resource name="keyboard4" type="image" filename="keyboard4" />
+ <resource name="cursor" type="image" filename="cursor" />
</resources>
<variables>
@@ -194,6 +195,12 @@
<variable name="slidervalue_sliderh" value="90" />
</variables>
+ <mousecursor>
+ <placement w="15" h="15" />
+ <background color="#FFFF00FF" resource="cursor" />
+ <speed multiplier="2.5" />
+ </mousecursor>
+
<templates>
<template name="header">
<background color="#000000FF" />
@@ -2459,7 +2466,16 @@
</object>
<object type="button">
- <placement x="%col_center_x%" y="%row4_y%" />
+ <highlight color="%highlight_color%" />
+ <placement x="%col2_x%" y="%row4_y%" />
+ <font resource="font" color="%button_text_color%" />
+ <text>Vibration Duration</text>
+ <image resource="main_button" />
+ <action function="page">Vibrate</action>
+ </object>
+
+ <object type="button">
+ <placement x="%col_x%" y="%row4_y%" />
<font resource="font" color="%button_text_color%" />
<text>Restore Defaults</text>
<image resource="main_button" />
@@ -2666,6 +2682,52 @@
<object type="template" name="footer" />
</page>
+ <page name="Vibrate">
+ <object type="template" name="header" />
+
+ <object type="text" color="%text_color%">
+ <font resource="font" />
+ <placement x="%center_x%" y="%row1_header_y%" placement="5" />
+ <text>Vibration Settings :</text>
+ </object>
+
+ <object type="slidervalue">
+ <placement x="col1_x" y="%row4_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Button Vibration:</text>
+ <data variable="tw_button_vibrate" min="0" max="300" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="slidervalue">
+ <placement x="col1_x" y="%row8_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Keyboard Vibration:</text>
+ <data variable="tw_keyboard_vibrate" min="0" max="300" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="slidervalue">
+ <placement x="col1_x" y="%row12_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Action Vibration:</text>
+ <data variable="tw_action_vibrate" min="0" max="500" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="action">
+ <touch key="home" />
+ <action function="page">main</action>
+ </object>
+
+ <object type="action">
+ <touch key="back" />
+ <action function="page">settings</action>
+ </object>
+
+ <object type="template" name="footer" />
+ </page>
+
<page name="advanced">
<object type="template" name="header" />
diff --git a/gui/devices/1280x800/res/images/cursor.png b/gui/devices/1280x800/res/images/cursor.png
new file mode 100644
index 000000000..32c8ae1ca
--- /dev/null
+++ b/gui/devices/1280x800/res/images/cursor.png
Binary files differ
diff --git a/gui/devices/1280x800/res/ui.xml b/gui/devices/1280x800/res/ui.xml
index 115a391eb..c7d914893 100644
--- a/gui/devices/1280x800/res/ui.xml
+++ b/gui/devices/1280x800/res/ui.xml
@@ -38,6 +38,7 @@
<resource name="keyboard2" type="image" filename="keyboard2" />
<resource name="keyboard3" type="image" filename="keyboard3" />
<resource name="keyboard4" type="image" filename="keyboard4" />
+ <resource name="cursor" type="image" filename="cursor" />
</resources>
<variables>
@@ -205,6 +206,12 @@
<variable name="slidervalue_sliderh" value="60" />
</variables>
+ <mousecursor>
+ <placement w="15" h="15" />
+ <background color="#FFFF00FF" resource="cursor" />
+ <speed multiplier="2" />
+ </mousecursor>
+
<templates>
<template name="header">
<background color="#000000FF" />
@@ -2430,20 +2437,29 @@
<object type="button">
<highlight color="%highlight_color%" />
- <placement x="%col4_x%" y="%row2_y%" />
+ <placement x="%col2_x%" y="%row2_y%" />
<font resource="font" color="%button_text_color%" />
- <text>Screen</text>
+ <text>Restore Defaults</text>
<image resource="main_button" />
- <action function="page">screen</action>
+ <action function="restoredefaultsettings"></action>
</object>
<object type="button">
<highlight color="%highlight_color%" />
- <placement x="%col_center_x%" y="%slider_y%" />
+ <placement x="%col3_x%" y="%row2_y%" />
<font resource="font" color="%button_text_color%" />
- <text>Restore Defaults</text>
+ <text>Vibration Duration</text>
<image resource="main_button" />
- <action function="restoredefaultsettings"></action>
+ <action function="page">Vibrate</action>
+ </object>
+
+ <object type="button">
+ <highlight color="%highlight_color%" />
+ <placement x="%col4_x%" y="%row2_y%" />
+ <font resource="font" color="%button_text_color%" />
+ <text>Screen</text>
+ <image resource="main_button" />
+ <action function="page">screen</action>
</object>
<object type="action">
@@ -2652,6 +2668,52 @@
<object type="template" name="footer" />
</page>
+ <page name="Vibrate">
+ <object type="template" name="header" />
+
+ <object type="text" color="%text_color%">
+ <font resource="font" />
+ <placement x="%center_x%" y="%row1_text_y%" placement="5" />
+ <text>Vibration Settings :</text>
+ </object>
+
+ <object type="slidervalue">
+ <placement x="slidervalue_x" y="%row3_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Button Vibration:</text>
+ <data variable="tw_button_vibrate" min="0" max="300" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="slidervalue">
+ <placement x="slidervalue_x" y="%row7_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Keyboard Vibration:</text>
+ <data variable="tw_keyboard_vibrate" min="0" max="300" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="slidervalue">
+ <placement x="slidervalue_x" y="%row11_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Action Vibration:</text>
+ <data variable="tw_action_vibrate" min="0" max="500" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="action">
+ <touch key="home" />
+ <action function="page">main</action>
+ </object>
+
+ <object type="action">
+ <touch key="back" />
+ <action function="page">settings</action>
+ </object>
+
+ <object type="template" name="footer" />
+ </page>
+
<page name="advanced">
<object type="template" name="header" />
diff --git a/gui/devices/1920x1200/res/images/cursor.png b/gui/devices/1920x1200/res/images/cursor.png
new file mode 100644
index 000000000..32c8ae1ca
--- /dev/null
+++ b/gui/devices/1920x1200/res/images/cursor.png
Binary files differ
diff --git a/gui/devices/1920x1200/res/ui.xml b/gui/devices/1920x1200/res/ui.xml
index fb615c135..dbd6a0b2d 100644
--- a/gui/devices/1920x1200/res/ui.xml
+++ b/gui/devices/1920x1200/res/ui.xml
@@ -38,6 +38,7 @@
<resource name="keyboard2" type="image" filename="keyboard2" />
<resource name="keyboard3" type="image" filename="keyboard3" />
<resource name="keyboard4" type="image" filename="keyboard4" />
+ <resource name="cursor" type="image" filename="cursor" />
</resources>
<variables>
@@ -205,6 +206,12 @@
<variable name="slidervalue_sliderh" value="80" />
</variables>
+ <mousecursor>
+ <placement w="15" h="15" />
+ <background color="#FFFF00FF" resource="cursor" />
+ <speed multiplier="2.5" />
+ </mousecursor>
+
<templates>
<template name="header">
<background color="#000000FF" />
@@ -2430,20 +2437,29 @@
<object type="button">
<highlight color="%highlight_color%" />
- <placement x="%col4_x%" y="%row2_y%" />
+ <placement x="%col2_x%" y="%row2_y%" />
<font resource="font" color="%button_text_color%" />
- <text>Screen</text>
+ <text>Restore Defaults</text>
<image resource="main_button" />
- <action function="page">screen</action>
+ <action function="restoredefaultsettings"></action>
</object>
<object type="button">
<highlight color="%highlight_color%" />
- <placement x="%col_center_x%" y="%slider_y%" />
+ <placement x="%col3_x%" y="%row2_y%" />
<font resource="font" color="%button_text_color%" />
- <text>Restore Defaults</text>
+ <text>Vibration Duration</text>
<image resource="main_button" />
- <action function="restoredefaultsettings"></action>
+ <action function="page">Vibrate</action>
+ </object>
+
+ <object type="button">
+ <highlight color="%highlight_color%" />
+ <placement x="%col4_x%" y="%row2_y%" />
+ <font resource="font" color="%button_text_color%" />
+ <text>Screen</text>
+ <image resource="main_button" />
+ <action function="page">screen</action>
</object>
<object type="action">
@@ -2652,6 +2668,52 @@
<object type="template" name="footer" />
</page>
+ <page name="Vibrate">
+ <object type="template" name="header" />
+
+ <object type="text" color="%text_color%">
+ <font resource="font" />
+ <placement x="%center_x%" y="%row1_text_y%" placement="5" />
+ <text>Vibration Settings :</text>
+ </object>
+
+ <object type="slidervalue">
+ <placement x="slidervalue_x" y="%row3_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Button Vibration:</text>
+ <data variable="tw_button_vibrate" min="0" max="300" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="slidervalue">
+ <placement x="slidervalue_x" y="%row7_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Keyboard Vibration:</text>
+ <data variable="tw_keyboard_vibrate" min="0" max="300" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="slidervalue">
+ <placement x="slidervalue_x" y="%row11_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Action Vibration:</text>
+ <data variable="tw_action_vibrate" min="0" max="500" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="action">
+ <touch key="home" />
+ <action function="page">main</action>
+ </object>
+
+ <object type="action">
+ <touch key="back" />
+ <action function="page">settings</action>
+ </object>
+
+ <object type="template" name="footer" />
+ </page>
+
<page name="advanced">
<object type="template" name="header" />
diff --git a/gui/devices/2560x1600/res/images/cursor.png b/gui/devices/2560x1600/res/images/cursor.png
new file mode 100644
index 000000000..32c8ae1ca
--- /dev/null
+++ b/gui/devices/2560x1600/res/images/cursor.png
Binary files differ
diff --git a/gui/devices/2560x1600/res/ui.xml b/gui/devices/2560x1600/res/ui.xml
index 9ce330a44..0a501afc0 100644
--- a/gui/devices/2560x1600/res/ui.xml
+++ b/gui/devices/2560x1600/res/ui.xml
@@ -38,6 +38,7 @@
<resource name="keyboard2" type="image" filename="keyboard2" />
<resource name="keyboard3" type="image" filename="keyboard3" />
<resource name="keyboard4" type="image" filename="keyboard4" />
+ <resource name="cursor" type="image" filename="cursor" />
</resources>
<variables>
@@ -205,6 +206,12 @@
<variable name="slidervalue_sliderh" value="90" />
</variables>
+ <mousecursor>
+ <placement w="15" h="15" />
+ <background color="#FFFF00FF" resource="cursor" />
+ <speed multiplier="2.5" />
+ </mousecursor>
+
<templates>
<template name="header">
<background color="#000000FF" />
@@ -2430,20 +2437,29 @@
<object type="button">
<highlight color="%highlight_color%" />
- <placement x="%col4_x%" y="%row2_y%" />
+ <placement x="%col2_x%" y="%row2_y%" />
<font resource="font" color="%button_text_color%" />
- <text>Screen</text>
+ <text>Restore Defaults</text>
<image resource="main_button" />
- <action function="page">screen</action>
+ <action function="restoredefaultsettings"></action>
</object>
<object type="button">
<highlight color="%highlight_color%" />
- <placement x="%col_center_x%" y="%slider_y%" />
+ <placement x="%col3_x%" y="%row2_y%" />
<font resource="font" color="%button_text_color%" />
- <text>Restore Defaults</text>
+ <text>Vibration Duration</text>
<image resource="main_button" />
- <action function="restoredefaultsettings"></action>
+ <action function="page">Vibrate</action>
+ </object>
+
+ <object type="button">
+ <highlight color="%highlight_color%" />
+ <placement x="%col4_x%" y="%row2_y%" />
+ <font resource="font" color="%button_text_color%" />
+ <text>Screen</text>
+ <image resource="main_button" />
+ <action function="page">screen</action>
</object>
<object type="action">
@@ -2652,6 +2668,52 @@
<object type="template" name="footer" />
</page>
+ <page name="Vibrate">
+ <object type="template" name="header" />
+
+ <object type="text" color="%text_color%">
+ <font resource="font" />
+ <placement x="%center_x%" y="%row1_text_y%" placement="5" />
+ <text>Vibration Settings :</text>
+ </object>
+
+ <object type="slidervalue">
+ <placement x="slidervalue_x" y="%row3_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Button Vibration:</text>
+ <data variable="tw_button_vibrate" min="0" max="300" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="slidervalue">
+ <placement x="slidervalue_x" y="%row7_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Keyboard Vibration:</text>
+ <data variable="tw_keyboard_vibrate" min="0" max="300" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="slidervalue">
+ <placement x="slidervalue_x" y="%row11_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Action Vibration:</text>
+ <data variable="tw_action_vibrate" min="0" max="500" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="action">
+ <touch key="home" />
+ <action function="page">main</action>
+ </object>
+
+ <object type="action">
+ <touch key="back" />
+ <action function="page">settings</action>
+ </object>
+
+ <object type="template" name="footer" />
+ </page>
+
<page name="advanced">
<object type="template" name="header" />
diff --git a/gui/devices/320x480/res/images/cursor.png b/gui/devices/320x480/res/images/cursor.png
new file mode 100644
index 000000000..32c8ae1ca
--- /dev/null
+++ b/gui/devices/320x480/res/images/cursor.png
Binary files differ
diff --git a/gui/devices/320x480/res/ui.xml b/gui/devices/320x480/res/ui.xml
index dbee885a7..3c3b73d26 100644
--- a/gui/devices/320x480/res/ui.xml
+++ b/gui/devices/320x480/res/ui.xml
@@ -39,6 +39,7 @@
<resource name="keyboard2" type="image" filename="keyboard2" />
<resource name="keyboard3" type="image" filename="keyboard3" />
<resource name="keyboard4" type="image" filename="keyboard4" />
+ <resource name="cursor" type="image" filename="cursor" />
</resources>
<variables>
@@ -186,6 +187,12 @@
<variable name="slidervalue_sliderh" value="20" />
</variables>
+ <mousecursor>
+ <placement w="15" h="15" />
+ <background color="#FFFF00FF" resource="cursor" />
+ <speed multiplier="1" />
+ </mousecursor>
+
<templates>
<template name="header">
<background color="#000000FF" />
@@ -2443,7 +2450,16 @@
</object>
<object type="button">
- <placement x="%col_center_x%" y="%row4_y%" />
+ <highlight color="%highlight_color%" />
+ <placement x="%col2_x%" y="%row4_y%" />
+ <font resource="font" color="%button_text_color%" />
+ <text>Vibration Duration</text>
+ <image resource="main_button" />
+ <action function="page">Vibrate</action>
+ </object>
+
+ <object type="button">
+ <placement x="%col_x%" y="%row4_y%" />
<font resource="font" color="%button_text_color%" />
<text>Restore Defaults</text>
<image resource="main_button" />
@@ -2650,6 +2666,52 @@
<object type="template" name="footer" />
</page>
+ <page name="Vibrate">
+ <object type="template" name="header" />
+
+ <object type="text" color="%text_color%">
+ <font resource="font" />
+ <placement x="%center_x%" y="%row1_header_y%" placement="5" />
+ <text>Vibration Settings :</text>
+ </object>
+
+ <object type="slidervalue">
+ <placement x="col1_x" y="%row4_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Button Vibration:</text>
+ <data variable="tw_button_vibrate" min="0" max="300" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="slidervalue">
+ <placement x="col1_x" y="%row8_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Keyboard Vibration:</text>
+ <data variable="tw_keyboard_vibrate" min="0" max="300" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="slidervalue">
+ <placement x="col1_x" y="%row12_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Action Vibration:</text>
+ <data variable="tw_action_vibrate" min="0" max="500" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="action">
+ <touch key="home" />
+ <action function="page">main</action>
+ </object>
+
+ <object type="action">
+ <touch key="back" />
+ <action function="page">settings</action>
+ </object>
+
+ <object type="template" name="footer" />
+ </page>
+
<page name="advanced">
<object type="template" name="header" />
diff --git a/gui/devices/480x800/res/images/cursor.png b/gui/devices/480x800/res/images/cursor.png
new file mode 100644
index 000000000..32c8ae1ca
--- /dev/null
+++ b/gui/devices/480x800/res/images/cursor.png
Binary files differ
diff --git a/gui/devices/480x800/res/ui.xml b/gui/devices/480x800/res/ui.xml
index bb90e70b4..32c90d936 100644
--- a/gui/devices/480x800/res/ui.xml
+++ b/gui/devices/480x800/res/ui.xml
@@ -39,6 +39,7 @@
<resource name="keyboard2" type="image" filename="keyboard2" />
<resource name="keyboard3" type="image" filename="keyboard3" />
<resource name="keyboard4" type="image" filename="keyboard4" />
+ <resource name="cursor" type="image" filename="cursor" />
</resources>
<variables>
@@ -186,6 +187,12 @@
<variable name="slidervalue_sliderh" value="40" />
</variables>
+ <mousecursor>
+ <placement w="15" h="15" />
+ <background color="#FFFF00FF" resource="cursor" />
+ <speed multiplier="1.5" />
+ </mousecursor>
+
<templates>
<template name="header">
<background color="%backgroundcolor%" />
@@ -2443,7 +2450,16 @@
</object>
<object type="button">
- <placement x="%col_center_x%" y="%row4_y%" />
+ <highlight color="%highlight_color%" />
+ <placement x="%col2_x%" y="%row4_y%" />
+ <font resource="font" color="%button_text_color%" />
+ <text>Vibration Duration</text>
+ <image resource="main_button" />
+ <action function="page">Vibrate</action>
+ </object>
+
+ <object type="button">
+ <placement x="%col_x%" y="%row4_y%" />
<font resource="font" color="%button_text_color%" />
<text>Restore Defaults</text>
<image resource="main_button" />
@@ -2650,6 +2666,52 @@
<object type="template" name="footer" />
</page>
+ <page name="Vibrate">
+ <object type="template" name="header" />
+
+ <object type="text" color="%text_color%">
+ <font resource="font" />
+ <placement x="%center_x%" y="%row1_header_y%" placement="5" />
+ <text>Vibration Settings :</text>
+ </object>
+
+ <object type="slidervalue">
+ <placement x="col1_x" y="%row4_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Button Vibration:</text>
+ <data variable="tw_button_vibrate" min="0" max="300" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="slidervalue">
+ <placement x="col1_x" y="%row8_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Keyboard Vibration:</text>
+ <data variable="tw_keyboard_vibrate" min="0" max="300" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="slidervalue">
+ <placement x="col1_x" y="%row12_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Action Vibration:</text>
+ <data variable="tw_action_vibrate" min="0" max="500" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="action">
+ <touch key="home" />
+ <action function="page">main</action>
+ </object>
+
+ <object type="action">
+ <touch key="back" />
+ <action function="page">settings</action>
+ </object>
+
+ <object type="template" name="footer" />
+ </page>
+
<page name="advanced">
<object type="template" name="header" />
diff --git a/gui/devices/480x854/res/images/cursor.png b/gui/devices/480x854/res/images/cursor.png
new file mode 100644
index 000000000..32c8ae1ca
--- /dev/null
+++ b/gui/devices/480x854/res/images/cursor.png
Binary files differ
diff --git a/gui/devices/480x854/res/ui.xml b/gui/devices/480x854/res/ui.xml
index 08c3ddcfe..a8357703c 100644
--- a/gui/devices/480x854/res/ui.xml
+++ b/gui/devices/480x854/res/ui.xml
@@ -39,6 +39,7 @@
<resource name="keyboard2" type="image" filename="keyboard2" />
<resource name="keyboard3" type="image" filename="keyboard3" />
<resource name="keyboard4" type="image" filename="keyboard4" />
+ <resource name="cursor" type="image" filename="cursor" />
</resources>
<variables>
@@ -185,6 +186,12 @@
<variable name="slidervalue_sliderh" value="40" />
</variables>
+ <mousecursor>
+ <placement w="15" h="15" />
+ <background color="#FFFF00FF" resource="cursor" />
+ <speed multiplier="1.5" />
+ </mousecursor>
+
<templates>
<template name="header">
<background color="%backgroundcolor%" />
@@ -2442,7 +2449,16 @@
</object>
<object type="button">
- <placement x="%col_center_x%" y="%row4_y%" />
+ <highlight color="%highlight_color%" />
+ <placement x="%col2_x%" y="%row4_y%" />
+ <font resource="font" color="%button_text_color%" />
+ <text>Vibration Duration</text>
+ <image resource="main_button" />
+ <action function="page">Vibrate</action>
+ </object>
+
+ <object type="button">
+ <placement x="%col_x%" y="%row4_y%" />
<font resource="font" color="%button_text_color%" />
<text>Restore Defaults</text>
<image resource="main_button" />
@@ -2649,6 +2665,52 @@
<object type="template" name="footer" />
</page>
+ <page name="Vibrate">
+ <object type="template" name="header" />
+
+ <object type="text" color="%text_color%">
+ <font resource="font" />
+ <placement x="%center_x%" y="%row1_header_y%" placement="5" />
+ <text>Vibration Settings :</text>
+ </object>
+
+ <object type="slidervalue">
+ <placement x="col1_x" y="%row4_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Button Vibration:</text>
+ <data variable="tw_button_vibrate" min="0" max="300" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="slidervalue">
+ <placement x="col1_x" y="%row8_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Keyboard Vibration:</text>
+ <data variable="tw_keyboard_vibrate" min="0" max="300" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="slidervalue">
+ <placement x="col1_x" y="%row12_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Action Vibration:</text>
+ <data variable="tw_action_vibrate" min="0" max="500" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="action">
+ <touch key="home" />
+ <action function="page">main</action>
+ </object>
+
+ <object type="action">
+ <touch key="back" />
+ <action function="page">settings</action>
+ </object>
+
+ <object type="template" name="footer" />
+ </page>
+
<page name="advanced">
<object type="template" name="header" />
diff --git a/gui/devices/540x960/res/images/cursor.png b/gui/devices/540x960/res/images/cursor.png
new file mode 100644
index 000000000..32c8ae1ca
--- /dev/null
+++ b/gui/devices/540x960/res/images/cursor.png
Binary files differ
diff --git a/gui/devices/540x960/res/ui.xml b/gui/devices/540x960/res/ui.xml
index e03704eef..0a43bebc2 100644
--- a/gui/devices/540x960/res/ui.xml
+++ b/gui/devices/540x960/res/ui.xml
@@ -39,6 +39,7 @@
<resource name="keyboard2" type="image" filename="keyboard2" />
<resource name="keyboard3" type="image" filename="keyboard3" />
<resource name="keyboard4" type="image" filename="keyboard4" />
+ <resource name="cursor" type="image" filename="cursor" />
</resources>
<variables>
@@ -186,6 +187,12 @@
<variable name="slidervalue_sliderh" value="45" />
</variables>
+ <mousecursor>
+ <placement w="15" h="15" />
+ <background color="#FFFF00FF" resource="cursor" />
+ <speed multiplier="1.5" />
+ </mousecursor>
+
<templates>
<template name="header">
<background color="#000000FF" />
@@ -2443,7 +2450,16 @@
</object>
<object type="button">
- <placement x="%col_center_x%" y="%row4_y%" />
+ <highlight color="%highlight_color%" />
+ <placement x="%col2_x%" y="%row4_y%" />
+ <font resource="font" color="%button_text_color%" />
+ <text>Vibration Duration</text>
+ <image resource="main_button" />
+ <action function="page">Vibrate</action>
+ </object>
+
+ <object type="button">
+ <placement x="%col_x%" y="%row4_y%" />
<font resource="font" color="%button_text_color%" />
<text>Restore Defaults</text>
<image resource="main_button" />
@@ -2650,6 +2666,52 @@
<object type="template" name="footer" />
</page>
+ <page name="Vibrate">
+ <object type="template" name="header" />
+
+ <object type="text" color="%text_color%">
+ <font resource="font" />
+ <placement x="%center_x%" y="%row1_header_y%" placement="5" />
+ <text>Vibration Settings :</text>
+ </object>
+
+ <object type="slidervalue">
+ <placement x="col1_x" y="%row4_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Button Vibration:</text>
+ <data variable="tw_button_vibrate" min="0" max="300" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="slidervalue">
+ <placement x="col1_x" y="%row8_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Keyboard Vibration:</text>
+ <data variable="tw_keyboard_vibrate" min="0" max="300" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="slidervalue">
+ <placement x="col1_x" y="%row12_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Action Vibration:</text>
+ <data variable="tw_action_vibrate" min="0" max="500" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="action">
+ <touch key="home" />
+ <action function="page">main</action>
+ </object>
+
+ <object type="action">
+ <touch key="back" />
+ <action function="page">settings</action>
+ </object>
+
+ <object type="template" name="footer" />
+ </page>
+
<page name="advanced">
<object type="template" name="header" />
diff --git a/gui/devices/720x1280/res/images/cursor.png b/gui/devices/720x1280/res/images/cursor.png
new file mode 100644
index 000000000..32c8ae1ca
--- /dev/null
+++ b/gui/devices/720x1280/res/images/cursor.png
Binary files differ
diff --git a/gui/devices/720x1280/res/ui.xml b/gui/devices/720x1280/res/ui.xml
index c9a4c0a69..37003da45 100644
--- a/gui/devices/720x1280/res/ui.xml
+++ b/gui/devices/720x1280/res/ui.xml
@@ -39,6 +39,7 @@
<resource name="keyboard2" type="image" filename="keyboard2" />
<resource name="keyboard3" type="image" filename="keyboard3" />
<resource name="keyboard4" type="image" filename="keyboard4" />
+ <resource name="cursor" type="image" filename="cursor" />
</resources>
<variables>
@@ -191,6 +192,12 @@
<variable name="slidervalue_sliderh" value="60" />
</variables>
+ <mousecursor>
+ <placement w="15" h="15" />
+ <background color="#FFFF00FF" resource="cursor" />
+ <speed multiplier="2" />
+ </mousecursor>
+
<templates>
<template name="header">
<background color="#000000FF" />
@@ -2456,7 +2463,16 @@
</object>
<object type="button">
- <placement x="%col_center_x%" y="%row4_y%" />
+ <highlight color="%highlight_color%" />
+ <placement x="%col2_x%" y="%row4_y%" />
+ <font resource="font" color="%button_text_color%" />
+ <text>Vibration Duration</text>
+ <image resource="main_button" />
+ <action function="page">Vibrate</action>
+ </object>
+
+ <object type="button">
+ <placement x="%col_x%" y="%row4_y%" />
<font resource="font" color="%button_text_color%" />
<text>Restore Defaults</text>
<image resource="main_button" />
@@ -2663,6 +2679,52 @@
<object type="template" name="footer" />
</page>
+ <page name="Vibrate">
+ <object type="template" name="header" />
+
+ <object type="text" color="%text_color%">
+ <font resource="font" />
+ <placement x="%center_x%" y="%row1_header_y%" placement="5" />
+ <text>Vibration Settings :</text>
+ </object>
+
+ <object type="slidervalue">
+ <placement x="col1_x" y="%row4_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Button Vibration:</text>
+ <data variable="tw_button_vibrate" min="0" max="300" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="slidervalue">
+ <placement x="col1_x" y="%row8_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Keyboard Vibration:</text>
+ <data variable="tw_keyboard_vibrate" min="0" max="300" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="slidervalue">
+ <placement x="col1_x" y="%row12_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Action Vibration:</text>
+ <data variable="tw_action_vibrate" min="0" max="500" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="action">
+ <touch key="home" />
+ <action function="page">main</action>
+ </object>
+
+ <object type="action">
+ <touch key="back" />
+ <action function="page">settings</action>
+ </object>
+
+ <object type="template" name="footer" />
+ </page>
+
<page name="advanced">
<object type="template" name="header" />
diff --git a/gui/devices/800x1280/res/images/cursor.png b/gui/devices/800x1280/res/images/cursor.png
new file mode 100644
index 000000000..32c8ae1ca
--- /dev/null
+++ b/gui/devices/800x1280/res/images/cursor.png
Binary files differ
diff --git a/gui/devices/800x1280/res/ui.xml b/gui/devices/800x1280/res/ui.xml
index 9b7a06315..31006e6fa 100755
--- a/gui/devices/800x1280/res/ui.xml
+++ b/gui/devices/800x1280/res/ui.xml
@@ -39,6 +39,7 @@
<resource name="keyboard2" type="image" filename="keyboard2" />
<resource name="keyboard3" type="image" filename="keyboard3" />
<resource name="keyboard4" type="image" filename="keyboard4" />
+ <resource name="cursor" type="image" filename="cursor" />
</resources>
<variables>
@@ -187,6 +188,12 @@
<variable name="slidervalue_sliderh" value="60" />
</variables>
+ <mousecursor>
+ <placement w="15" h="15" />
+ <background color="#FFFF00FF" resource="cursor" />
+ <speed multiplier="2.5" />
+ </mousecursor>
+
<templates>
<template name="header">
<background color="#000000FF" />
@@ -2444,7 +2451,16 @@
</object>
<object type="button">
- <placement x="%col_center_x%" y="%row4_y%" />
+ <highlight color="%highlight_color%" />
+ <placement x="%col2_x%" y="%row4_y%" />
+ <font resource="font" color="%button_text_color%" />
+ <text>Vibration Duration</text>
+ <image resource="main_button" />
+ <action function="page">Vibrate</action>
+ </object>
+
+ <object type="button">
+ <placement x="%col_x%" y="%row4_y%" />
<font resource="font" color="%button_text_color%" />
<text>Restore Defaults</text>
<image resource="main_button" />
@@ -2651,6 +2667,52 @@
<object type="template" name="footer" />
</page>
+ <page name="Vibrate">
+ <object type="template" name="header" />
+
+ <object type="text" color="%text_color%">
+ <font resource="font" />
+ <placement x="%center_x%" y="%row1_header_y%" placement="5" />
+ <text>Vibration Settings :</text>
+ </object>
+
+ <object type="slidervalue">
+ <placement x="col1_x" y="%row4_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Button Vibration:</text>
+ <data variable="tw_button_vibrate" min="0" max="300" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="slidervalue">
+ <placement x="col1_x" y="%row8_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Keyboard Vibration:</text>
+ <data variable="tw_keyboard_vibrate" min="0" max="300" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="slidervalue">
+ <placement x="col1_x" y="%row12_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Action Vibration:</text>
+ <data variable="tw_action_vibrate" min="0" max="500" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="action">
+ <touch key="home" />
+ <action function="page">main</action>
+ </object>
+
+ <object type="action">
+ <touch key="back" />
+ <action function="page">settings</action>
+ </object>
+
+ <object type="template" name="footer" />
+ </page>
+
<page name="advanced">
<object type="template" name="header" />
diff --git a/gui/devices/800x480/res/images/cursor.png b/gui/devices/800x480/res/images/cursor.png
new file mode 100644
index 000000000..32c8ae1ca
--- /dev/null
+++ b/gui/devices/800x480/res/images/cursor.png
Binary files differ
diff --git a/gui/devices/800x480/res/ui.xml b/gui/devices/800x480/res/ui.xml
index 9c391b33e..8f881d779 100755
--- a/gui/devices/800x480/res/ui.xml
+++ b/gui/devices/800x480/res/ui.xml
@@ -38,6 +38,7 @@
<resource name="keyboard2" type="image" filename="keyboard2" />
<resource name="keyboard3" type="image" filename="keyboard3" />
<resource name="keyboard4" type="image" filename="keyboard4" />
+ <resource name="cursor" type="image" filename="cursor" />
</resources>
<variables>
@@ -205,6 +206,12 @@
<variable name="slidervalue_sliderh" value="40" />
</variables>
+ <mousecursor>
+ <placement w="15" h="15" />
+ <background color="#FFFF00FF" resource="cursor" />
+ <speed multiplier="1.5" />
+ </mousecursor>
+
<templates>
<template name="header">
<background color="#000000FF" />
@@ -2438,20 +2445,29 @@
<object type="button">
<highlight color="%highlight_color%" />
- <placement x="%col4_x%" y="%row2_y%" />
+ <placement x="%col2_x%" y="%row2_y%" />
<font resource="font" color="%button_text_color%" />
- <text>Screen</text>
+ <text>Restore Defaults</text>
<image resource="main_button" />
- <action function="page">screen</action>
+ <action function="restoredefaultsettings"></action>
</object>
<object type="button">
<highlight color="%highlight_color%" />
- <placement x="%col_center_x%" y="%slider_y%" />
+ <placement x="%col3_x%" y="%row2_y%" />
<font resource="font" color="%button_text_color%" />
- <text>Restore Defaults</text>
+ <text>Vibration Duration</text>
<image resource="main_button" />
- <action function="restoredefaultsettings"></action>
+ <action function="page">Vibrate</action>
+ </object>
+
+ <object type="button">
+ <highlight color="%highlight_color%" />
+ <placement x="%col4_x%" y="%row2_y%" />
+ <font resource="font" color="%button_text_color%" />
+ <text>Screen</text>
+ <image resource="main_button" />
+ <action function="page">screen</action>
</object>
<object type="action">
@@ -2660,6 +2676,52 @@
<object type="template" name="footer" />
</page>
+ <page name="Vibrate">
+ <object type="template" name="header" />
+
+ <object type="text" color="%text_color%">
+ <font resource="font" />
+ <placement x="%center_x%" y="%row1_text_y%" placement="5" />
+ <text>Vibration Settings :</text>
+ </object>
+
+ <object type="slidervalue">
+ <placement x="slidervalue_x" y="%row3_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Button Vibration:</text>
+ <data variable="tw_button_vibrate" min="0" max="300" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="slidervalue">
+ <placement x="slidervalue_x" y="%row7_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Keyboard Vibration:</text>
+ <data variable="tw_keyboard_vibrate" min="0" max="300" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="slidervalue">
+ <placement x="slidervalue_x" y="%row11_text_y%" w="%slidervalue_w%" />
+ <font resource="font" color="%text_color%" />
+ <text>Action Vibration:</text>
+ <data variable="tw_action_vibrate" min="0" max="500" />
+ <colors line="%slidervalue_line_clr%" slider="%slidervalue_slider_clr%" />
+ </object>
+
+ <object type="action">
+ <touch key="home" />
+ <action function="page">main</action>
+ </object>
+
+ <object type="action">
+ <touch key="back" />
+ <action function="page">settings</action>
+ </object>
+
+ <object type="template" name="footer" />
+ </page>
+
<page name="advanced">
<object type="template" name="header" />
diff --git a/gui/gui.cpp b/gui/gui.cpp
index e9efc1db9..912899f07 100644
--- a/gui/gui.cpp
+++ b/gui/gui.cpp
@@ -57,6 +57,9 @@ extern "C"
#include "blanktimer.hpp"
#endif
+// Enable to print render time of each frame to the log file
+//#define PRINT_RENDER_TIME 1
+
const static int CURTAIN_FADE = 32;
using namespace rapidxml;
@@ -186,6 +189,7 @@ static void * input_thread(void *cookie)
static struct timeval touchStart;
HardwareKeyboard kb;
string seconds;
+ MouseCursor *cursor = PageManager::GetMouseCursor();
#ifndef TW_NO_SCREEN_TIMEOUT
//start screen timeout threads
@@ -329,7 +333,47 @@ static void * input_thread(void *cookie)
#ifdef _EVENT_LOGGING
LOGERR("TOUCH_KEY: %d\n", ev.code);
#endif
- if (ev.value != 0)
+ // Left mouse button
+ if(ev.code == BTN_LEFT)
+ {
+ if(ev.value == 1)
+ {
+ cursor->GetPos(x, y);
+
+ if (PageManager::NotifyTouch(TOUCH_START, x, y) > 0)
+ state = 1;
+ drag = 1;
+ touch_and_hold = 1;
+ dontwait = 1;
+ key_repeat = 0;
+ gettimeofday(&touchStart, NULL);
+ }
+ else if(drag == 1)
+ {
+ if (state == 0)
+ {
+ cursor->GetPos(x, y);
+
+ PageManager::NotifyTouch(TOUCH_RELEASE, x, y);
+
+ touch_and_hold = 0;
+ touch_repeat = 0;
+ if (!key_repeat)
+ dontwait = 0;
+ }
+ state = 0;
+ drag = 0;
+ }
+ }
+ // side mouse button, often used for "back" function
+ else if(ev.code == BTN_SIDE)
+ {
+ if(ev.value == 1)
+ kb.KeyDown(KEY_BACK);
+ else
+ kb.KeyUp(KEY_BACK);
+ }
+ else if (ev.value != 0)
{
// This is a key press
if (kb.KeyDown(ev.code))
@@ -367,6 +411,26 @@ static void * input_thread(void *cookie)
#endif
}
}
+ else if(ev.type == EV_REL)
+ {
+#ifdef _EVENT_LOGGING
+ LOGERR("EV_REL %d %d\n", ev.code, ev.value);
+#endif
+ if(ev.code == REL_X)
+ cursor->Move(ev.value, 0);
+ else if(ev.code == REL_Y)
+ cursor->Move(0, ev.value);
+
+ if(drag == 1) {
+ cursor->GetPos(x, y);
+#ifdef _EVENT_LOGGING
+ LOGERR("TOUCH_DRAG: %d, %d\n", x, y);
+#endif
+ if (PageManager::NotifyTouch(TOUCH_DRAG, x, y) > 0)
+ state = 1;
+ key_repeat = 0;
+ }
+ }
}
return NULL;
}
@@ -423,6 +487,11 @@ static int runPages(void)
DataManager::SetValue("tw_loaded", 1);
+#ifdef PRINT_RENDER_TIME
+ timespec start, end;
+ int32_t render_t, flip_t;
+#endif
+
for (;;)
{
loopTimer();
@@ -432,11 +501,30 @@ static int runPages(void)
int ret;
ret = PageManager::Update();
+
+#ifndef PRINT_RENDER_TIME
if (ret > 1)
PageManager::Render();
if (ret > 0)
flip();
+#else
+ if (ret > 1)
+ {
+ clock_gettime(CLOCK_MONOTONIC, &start);
+ PageManager::Render();
+ clock_gettime(CLOCK_MONOTONIC, &end);
+ render_t = TWFunc::timespec_diff_ms(start, end);
+
+ flip();
+ clock_gettime(CLOCK_MONOTONIC, &start);
+ flip_t = TWFunc::timespec_diff_ms(end, start);
+
+ LOGINFO("Render(): %u ms, flip(): %u ms, total: %u ms\n", render_t, flip_t, render_t+flip_t);
+ }
+ else if(ret == 1)
+ flip();
+#endif
}
else
{
diff --git a/gui/keyboard.cpp b/gui/keyboard.cpp
index 95cdbf1c8..36106c7c1 100644
--- a/gui/keyboard.cpp
+++ b/gui/keyboard.cpp
@@ -30,6 +30,7 @@
#include <time.h>
#include <unistd.h>
#include <stdlib.h>
+#include "../data.hpp"
#include <string>
@@ -475,6 +476,7 @@ int GUIKeyboard::NotifyTouch(TOUCH_STATE state, int x, int y)
startSelection = 0;
break;
} else if (state == TOUCH_RELEASE && was_held == 0) {
+ DataManager::Vibrate("tw_keyboard_vibrate");
if ((int)keyboard_keys[currentLayout - 1][rowIndex][indexx].key < KEYBOARD_SPECIAL_KEYS && (int)keyboard_keys[currentLayout - 1][rowIndex][indexx].key > 0) {
// Regular key
PageManager::NotifyKeyboard(keyboard_keys[currentLayout - 1][rowIndex][indexx].key);
@@ -500,6 +502,7 @@ int GUIKeyboard::NotifyTouch(TOUCH_STATE state, int x, int y)
PageManager::NotifyKeyboard(keyboard_keys[currentLayout - 1][rowIndex][indexx].key);
} else if ((int)keyboard_keys[currentLayout - 1][rowIndex][indexx].longpresskey < KEYBOARD_SPECIAL_KEYS && (int)keyboard_keys[currentLayout - 1][rowIndex][indexx].longpresskey > 0) {
// Long Press Key
+ DataManager::Vibrate("tw_keyboard_vibrate");
PageManager::NotifyKeyboard(keyboard_keys[currentLayout - 1][rowIndex][indexx].longpresskey);
}
} else if (state == TOUCH_REPEAT) {
diff --git a/gui/mousecursor.cpp b/gui/mousecursor.cpp
new file mode 100644
index 000000000..1c22356f9
--- /dev/null
+++ b/gui/mousecursor.cpp
@@ -0,0 +1,154 @@
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <sys/reboot.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <time.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#include <string>
+
+extern "C" {
+#include "../twcommon.h"
+#include "../minuitwrp/minui.h"
+}
+
+#include "rapidxml.hpp"
+#include "objects.hpp"
+
+MouseCursor::MouseCursor(int resX, int resY)
+{
+ ResetData(resX, resY);
+}
+
+MouseCursor::~MouseCursor()
+{
+}
+
+void MouseCursor::ResetData(int resX, int resY)
+{
+ m_resX = resX;
+ m_resY = resY;
+ m_moved = false;
+ m_speedMultiplier = 2.5f;
+ m_image = NULL;
+ m_present = false;
+
+ ConvertStrToColor("red", &m_color);
+
+ SetRenderPos(resX/2, resY/2, 10, 10);
+}
+
+void MouseCursor::LoadData(xml_node<>* node)
+{
+ xml_attribute<>* attr;
+ xml_node<>* child;
+
+ child = node->first_node("placement");
+ if(child)
+ LoadPlacement(child, &mRenderX, &mRenderY, &mRenderW, &mRenderH);
+
+ child = node->first_node("background");
+ if(child)
+ {
+ attr = child->first_attribute("color");
+ if(attr)
+ ConvertStrToColor(attr->value(), &m_color);
+
+ attr = child->first_attribute("resource");
+ if(attr)
+ {
+ m_image = PageManager::FindResource(attr->value());
+ if(m_image)
+ {
+ mRenderW = gr_get_width(m_image->GetResource());
+ mRenderH = gr_get_height(m_image->GetResource());
+ }
+ }
+ }
+
+ child = node->first_node("speed");
+ if(child)
+ {
+ attr = child->first_attribute("multiplier");
+ if(attr)
+ m_speedMultiplier = atof(attr->value());
+ }
+}
+
+int MouseCursor::Render(void)
+{
+ if(!m_present)
+ return 0;
+
+ if(m_image)
+ {
+ gr_blit(m_image->GetResource(), 0, 0, mRenderW, mRenderH, mRenderX, mRenderY);
+ }
+ else
+ {
+ gr_color(m_color.red, m_color.green, m_color.blue, m_color.alpha);
+ gr_fill(mRenderX, mRenderY, mRenderW, mRenderH);
+ }
+ return 0;
+}
+
+int MouseCursor::Update(void)
+{
+ if(m_present != ev_has_mouse())
+ {
+ m_present = ev_has_mouse();
+ if(m_present)
+ SetRenderPos(m_resX/2, m_resY/2);
+ return 2;
+ }
+
+ if(m_present && m_moved)
+ {
+ m_moved = false;
+ return 2;
+ }
+ return 0;
+}
+
+int MouseCursor::SetRenderPos(int x, int y, int w, int h)
+{
+ if(x == mRenderX && y == mRenderY)
+ m_moved = true;
+
+ return RenderObject::SetRenderPos(x, y, w, h);
+}
+
+void MouseCursor::Move(int deltaX, int deltaY)
+{
+ if(deltaX != 0)
+ {
+ mRenderX += deltaX*m_speedMultiplier;
+ mRenderX = (std::min)(mRenderX, m_resX);
+ mRenderX = (std::max)(mRenderX, 0);
+
+ m_moved = true;
+ }
+
+ if(deltaY != 0)
+ {
+ mRenderY += deltaY*m_speedMultiplier;
+ mRenderY = (std::min)(mRenderY, m_resY);
+ mRenderY = (std::max)(mRenderY, 0);
+
+ m_moved = true;
+ }
+}
+
+void MouseCursor::GetPos(int& x, int& y)
+{
+ x = mRenderX;
+ y = mRenderY;
+}
diff --git a/gui/objects.hpp b/gui/objects.hpp
index e7bb2a0ee..e8110b016 100644
--- a/gui/objects.hpp
+++ b/gui/objects.hpp
@@ -25,6 +25,7 @@
#include <vector>
#include <string>
#include <map>
+#include <time.h>
extern "C" {
#ifdef HAVE_SELINUX
@@ -285,6 +286,7 @@ protected:
void operation_start(const string operation_name);
void operation_end(const int operation_status, const int simulate);
static void* command_thread(void *cookie);
+ time_t Start;
};
class GUIConsole : public RenderObject, public ActionObject
@@ -976,6 +978,31 @@ protected:
int lineW;
};
+class MouseCursor : public RenderObject
+{
+public:
+ MouseCursor(int posX, int posY);
+ virtual ~MouseCursor();
+
+ virtual int Render(void);
+ virtual int Update(void);
+ virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
+
+ void Move(int deltaX, int deltaY);
+ void GetPos(int& x, int& y);
+ void LoadData(xml_node<>* node);
+ void ResetData(int resX, int resY);
+
+private:
+ int m_resX;
+ int m_resY;
+ bool m_moved;
+ float m_speedMultiplier;
+ COLOR m_color;
+ Resource *m_image;
+ bool m_present;
+};
+
// Helper APIs
bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, RenderObject::Placement* placement = NULL);
diff --git a/gui/pages.cpp b/gui/pages.cpp
index d662f18f8..dc9edc798 100644
--- a/gui/pages.cpp
+++ b/gui/pages.cpp
@@ -54,6 +54,7 @@ extern blanktimer blankTimer;
std::map<std::string, PageSet*> PageManager::mPageSets;
PageSet* PageManager::mCurrentSet;
PageSet* PageManager::mBaseSet = NULL;
+MouseCursor *PageManager::mMouseCursor = NULL;
// Helper routine to convert a string to a color declaration
int ConvertStrToColor(std::string str, COLOR* color)
@@ -550,6 +551,11 @@ int PageSet::Load(ZipArchive* package)
if (child)
LoadVariables(child);
+ LOGINFO("Loading mouse cursor...\n");
+ child = parent->first_node("mousecursor");
+ if(child)
+ PageManager::LoadCursorData(child);
+
LOGINFO("Loading pages...\n");
// This may be NULL if no templates are present
templates = parent->first_node("templates");
@@ -849,6 +855,9 @@ int PageManager::ReloadPackage(std::string name, std::string package)
if (iter == mPageSets.end())
return -1;
+ if(mMouseCursor)
+ mMouseCursor->ResetData(gr_fb_width(), gr_fb_height());
+
PageSet* set = (*iter).second;
mPageSets.erase(iter);
@@ -924,7 +933,25 @@ int PageManager::IsCurrentPage(Page* page)
int PageManager::Render(void)
{
- return (mCurrentSet ? mCurrentSet->Render() : -1);
+ int res = (mCurrentSet ? mCurrentSet->Render() : -1);
+ if(mMouseCursor)
+ mMouseCursor->Render();
+ return res;
+}
+
+MouseCursor *PageManager::GetMouseCursor()
+{
+ if(!mMouseCursor)
+ mMouseCursor = new MouseCursor(gr_fb_width(), gr_fb_height());
+ return mMouseCursor;
+}
+
+void PageManager::LoadCursorData(xml_node<>* node)
+{
+ if(!mMouseCursor)
+ mMouseCursor = new MouseCursor(gr_fb_width(), gr_fb_height());
+
+ mMouseCursor->LoadData(node);
}
int PageManager::Update(void)
@@ -933,7 +960,16 @@ int PageManager::Update(void)
if(blankTimer.IsScreenOff())
return 0;
#endif
- return (mCurrentSet ? mCurrentSet->Update() : -1);
+
+ int res = (mCurrentSet ? mCurrentSet->Update() : -1);
+
+ if(mMouseCursor)
+ {
+ int c_res = mMouseCursor->Update();
+ if(c_res > res)
+ res = c_res;
+ }
+ return res;
}
int PageManager::NotifyTouch(TOUCH_STATE state, int x, int y)
diff --git a/gui/pages.hpp b/gui/pages.hpp
index a37cdb9f2..2a2ef2c32 100644
--- a/gui/pages.hpp
+++ b/gui/pages.hpp
@@ -28,6 +28,7 @@ class ResourceManager;
class RenderObject;
class ActionObject;
class InputObject;
+class MouseCursor;
class Page
{
@@ -130,6 +131,9 @@ public:
static int SetKeyBoardFocus(int inFocus);
static int NotifyVarChange(std::string varName, std::string value);
+ static MouseCursor *GetMouseCursor();
+ static void LoadCursorData(xml_node<>* node);
+
protected:
static PageSet* FindPackage(std::string name);
@@ -137,6 +141,7 @@ protected:
static std::map<std::string, PageSet*> mPageSets;
static PageSet* mCurrentSet;
static PageSet* mBaseSet;
+ static MouseCursor *mMouseCursor;
};
#endif // _PAGES_HEADER_HPP
diff --git a/gui/slider.cpp b/gui/slider.cpp
index b46d156f6..af0c542de 100644
--- a/gui/slider.cpp
+++ b/gui/slider.cpp
@@ -15,6 +15,7 @@
#include <time.h>
#include <unistd.h>
#include <stdlib.h>
+#include "../data.hpp"
#include <string>
@@ -156,8 +157,10 @@ int GUISlider::NotifyTouch(TOUCH_STATE state, int x, int y)
if (!dragging)
return 0;
- if (sCurTouchX >= mRenderX + mRenderW - sTouchW)
+ if (sCurTouchX >= mRenderX + mRenderW - sTouchW) {
+ DataManager::Vibrate("tw_button_vibrate");
sAction->doActions();
+ }
sCurTouchX = mRenderX;
dragging = false;
diff --git a/libtar/extract.c b/libtar/extract.c
index 8081aa2b9..d9ab7882f 100644
--- a/libtar/extract.c
+++ b/libtar/extract.c
@@ -159,11 +159,14 @@ tar_extract_file(TAR *t, char *realname, char *prefix)
if((t->options & TAR_STORE_SELINUX) && t->th_buf.selinux_context != NULL)
{
#ifdef DEBUG
- printf(" Restoring SELinux context %s to file %s\n", t->th_buf.selinux_context, realname);
+ printf(" Restoring SELinux context %s to file %s\n", t->th_buf.selinux_context, realname);
#endif
if (lsetfilecon(realname, t->th_buf.selinux_context) < 0) {
fprintf(stderr, "Failed to restore SELinux context %s!\n", strerror(errno));
}
+ if (lsetfilecon(dirname(realname), t->th_buf.selinux_context) < 0) {
+ fprintf(stderr, "Failed to restore SELinux context %s!\n", strerror(errno));
+ }
}
#endif
diff --git a/libtar/wrapper.c b/libtar/wrapper.c
index dab7e0076..708c845b9 100644
--- a/libtar/wrapper.c
+++ b/libtar/wrapper.c
@@ -80,12 +80,6 @@ tar_extract_all(TAR *t, char *prefix)
"\"%s\")\n", buf);
#endif
printf("item name: '%s'\n", filename);
- /*
- if (strcmp(filename, "/") == 0) {
- printf("skipping /\n");
- continue;
- }
- */
if (tar_extract_file(t, buf, prefix) != 0)
return -1;
}
diff --git a/minuitwrp/events.c b/minuitwrp/events.c
index 73369a2cc..94942ba7b 100644
--- a/minuitwrp/events.c
+++ b/minuitwrp/events.c
@@ -20,8 +20,11 @@
#include <dirent.h>
#include <sys/poll.h>
#include <limits.h>
-
#include <linux/input.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
#include "../common.h"
@@ -95,6 +98,9 @@ struct ev {
static struct pollfd ev_fds[MAX_DEVICES];
static struct ev evs[MAX_DEVICES];
static unsigned ev_count = 0;
+static struct timeval lastInputStat;
+static unsigned long lastInputMTime;
+static int has_mouse = 0;
static inline int ABS(int x) {
return x<0?-x:x;
@@ -106,6 +112,8 @@ int vibrate(int timeout_ms)
int fd;
int ret;
+ if (timeout_ms > 10000) timeout_ms = 1000;
+
fd = open(VIBRATOR_TIMEOUT_FILE, O_WRONLY);
if (fd < 0)
return -1;
@@ -237,12 +245,41 @@ static int vk_init(struct ev *e)
return 0;
}
+#define BITS_PER_LONG (sizeof(long) * 8)
+#define NBITS(x) ((((x)-1)/BITS_PER_LONG)+1)
+#define OFF(x) ((x)%BITS_PER_LONG)
+#define LONG(x) ((x)/BITS_PER_LONG)
+#define test_bit(bit, array) ((array[LONG(bit)] >> OFF(bit)) & 1)
+static void check_mouse(int fd)
+{
+ if(has_mouse)
+ return;
+
+ unsigned long bit[EV_MAX][NBITS(KEY_MAX)];
+ memset(bit, 0, sizeof(bit));
+ ioctl(fd, EVIOCGBIT(0, EV_MAX), bit[0]);
+
+ if(!test_bit(EV_REL, bit[0]))
+ return;
+
+ ioctl(fd, EVIOCGBIT(EV_REL, KEY_MAX), bit[EV_REL]);
+ if(test_bit(REL_X, bit[EV_REL]) && test_bit(REL_Y, bit[EV_REL]))
+ has_mouse = 1;
+}
+
+int ev_has_mouse(void)
+{
+ return has_mouse;
+}
+
int ev_init(void)
{
DIR *dir;
struct dirent *de;
int fd;
+ has_mouse = 0;
+
dir = opendir("/dev/input");
if(dir != 0) {
while((de = readdir(dir))) {
@@ -258,23 +295,32 @@ int ev_init(void)
/* Load virtualkeys if there are any */
vk_init(&evs[ev_count]);
+ check_mouse(fd);
+
ev_count++;
if(ev_count == MAX_DEVICES) break;
}
+ closedir(dir);
}
+ struct stat st;
+ if(stat("/dev/input", &st) >= 0)
+ lastInputMTime = st.st_mtime;
+ gettimeofday(&lastInputStat, NULL);
+
return 0;
}
void ev_exit(void)
{
- while (ev_count-- > 0) {
- if (evs[ev_count].vk_count) {
- free(evs[ev_count].vks);
- evs[ev_count].vk_count = 0;
+ while (ev_count-- > 0) {
+ if (evs[ev_count].vk_count) {
+ free(evs[ev_count].vks);
+ evs[ev_count].vk_count = 0;
+ }
+ close(ev_fds[ev_count].fd);
}
- close(ev_fds[ev_count].fd);
- }
+ ev_count = 0;
}
static int vk_inside_display(__s32 value, struct input_absinfo *info, int screen_size)
@@ -627,9 +673,25 @@ int ev_get(struct input_event *ev, unsigned dont_wait)
{
int r;
unsigned n;
+ struct timeval curr;
do {
- r = poll(ev_fds, ev_count, dont_wait ? 0 : -1);
+ gettimeofday(&curr, NULL);
+ if(curr.tv_sec - lastInputStat.tv_sec >= 2)
+ {
+ struct stat st;
+ stat("/dev/input", &st);
+ if (st.st_mtime > lastInputMTime)
+ {
+ LOGI("Reloading input devices\n");
+ ev_exit();
+ ev_init();
+ lastInputMTime = st.st_mtime;
+ }
+ lastInputStat = curr;
+ }
+
+ r = poll(ev_fds, ev_count, 0);
if(r > 0) {
for(n = 0; n < ev_count; n++) {
@@ -642,6 +704,8 @@ int ev_get(struct input_event *ev, unsigned dont_wait)
}
}
}
+
+ usleep(1000);
} while(dont_wait == 0);
return -1;
diff --git a/minuitwrp/minui.h b/minuitwrp/minui.h
index 03e15bb81..bbdfdfb50 100644
--- a/minuitwrp/minui.h
+++ b/minuitwrp/minui.h
@@ -58,6 +58,7 @@ struct input_event;
int ev_init(void);
void ev_exit(void);
int ev_get(struct input_event *ev, unsigned dont_wait);
+int ev_has_mouse(void);
// Resources
@@ -70,4 +71,6 @@ int ev_wait(int timeout);
void ev_dispatch(void);
int ev_get_input(int fd, short revents, struct input_event *ev);
+int vibrate(int timeout_ms);
+
#endif
diff --git a/partition.cpp b/partition.cpp
index 31af3cfe8..3f19b7d61 100644
--- a/partition.cpp
+++ b/partition.cpp
@@ -40,6 +40,7 @@
#include "twrpDigest.hpp"
#include "twrpTar.hpp"
#include "twrpDU.hpp"
+#include "fixPermissions.hpp"
extern "C" {
#include "mtdutils/mtdutils.h"
#include "mtdutils/mounts.h"
@@ -1511,6 +1512,9 @@ bool TWPartition::Wipe_F2FS() {
bool TWPartition::Wipe_Data_Without_Wiping_Media() {
string dir;
+ #ifdef HAVE_SELINUX
+ fixPermissions perms;
+ #endif
// This handles wiping data on devices with "sdcard" in /data/media
if (!Mount(true))
@@ -1541,6 +1545,10 @@ bool TWPartition::Wipe_Data_Without_Wiping_Media() {
}
closedir(d);
+ #ifdef HAVE_SELINUX
+ perms.fixDataInternalContexts();
+ #endif
+
gui_print("Done.\n");
return true;
}
@@ -1811,12 +1819,19 @@ void TWPartition::Find_Actual_Block_Device(void) {
void TWPartition::Recreate_Media_Folder(void) {
string Command;
+ #ifdef HAVE_SELINUX
+ fixPermissions perms;
+ #endif
+
if (!Mount(true)) {
LOGERR("Unable to recreate /data/media folder.\n");
} else if (!TWFunc::Path_Exists("/data/media")) {
PartitionManager.Mount_By_Path(Symlink_Mount_Point, true);
LOGINFO("Recreating /data/media folder.\n");
mkdir("/data/media", S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
+ #ifdef HAVE_SELINUX
+ perms.fixDataInternalContexts();
+ #endif
PartitionManager.UnMount_By_Path(Symlink_Mount_Point, true);
}
}
diff --git a/twrp-functions.cpp b/twrp-functions.cpp
index 3f44fd2ce..df7174362 100644
--- a/twrp-functions.cpp
+++ b/twrp-functions.cpp
@@ -515,6 +515,12 @@ timespec TWFunc::timespec_diff(timespec& start, timespec& end)
return temp;
}
+int32_t TWFunc::timespec_diff_ms(timespec& start, timespec& end)
+{
+ return ((end.tv_sec * 1000) + end.tv_nsec/1000000) -
+ ((start.tv_sec * 1000) + start.tv_nsec/1000000);
+}
+
int TWFunc::drop_caches(void) {
string file = "/proc/sys/vm/drop_caches";
string value = "3";
diff --git a/twrp-functions.hpp b/twrp-functions.hpp
index eb88ae2f3..587d7725e 100644
--- a/twrp-functions.hpp
+++ b/twrp-functions.hpp
@@ -60,6 +60,7 @@ public:
static int copy_file(string src, string dst, int mode); //copy file from src to dst with mode permissions
static unsigned int Get_D_Type_From_Stat(string Path); // Returns a dirent dt_type value using stat instead of dirent
static timespec timespec_diff(timespec& start, timespec& end); // Return a diff for 2 times
+ static int32_t timespec_diff_ms(timespec& start, timespec& end); // Returns diff in ms
static int read_file(string fn, vector<string>& results); //read from file
static int read_file(string fn, string& results); //read from file
static int write_file(string fn, string& line); //write from file