Skip to content

Commit d78bcd4

Browse files
author
Hrvoje Cavrak
committed
Fix screensaver issue with rapid movement.
1 parent fa4ccdf commit d78bcd4

File tree

4 files changed

+22
-14
lines changed

4 files changed

+22
-14
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.6)
22

33
## Version Configuration
44
set(VERSION_MAJOR 00)
5-
set(VERSION_MINOR 161)
5+
set(VERSION_MINOR 162)
66

77
## Release Type Selection
88
option(DH_DEBUG "Build a debug version" OFF)

src/handlers.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ void _get_border_position(device_t *state, border_size_t *border) {
3939
border->top = state->pointer_y;
4040
}
4141

42-
void _screensaver_set(device_t *state, bool value) {
42+
void _screensaver_set(device_t *state, uint8_t value) {
4343
if (CURRENT_BOARD_IS_ACTIVE_OUTPUT)
4444
state->config.output[BOARD_ROLE].screensaver.mode = value;
4545
else
@@ -123,12 +123,18 @@ void mouse_zoom_hotkey_handler(device_t *state, hid_keyboard_report_t *report) {
123123

124124
/* When pressed, enables the screensaver on active output */
125125
void enable_screensaver_hotkey_handler(device_t *state, hid_keyboard_report_t *report) {
126-
_screensaver_set(state, true);
126+
uint8_t desired_mode = state->config.output[BOARD_ROLE].screensaver.mode;
127+
128+
/* If the user explicitly asks for screensaver to be active, ignore config and turn it on */
129+
if (desired_mode == DISABLED)
130+
desired_mode = PONG;
131+
132+
_screensaver_set(state, desired_mode);
127133
}
128134

129135
/* When pressed, disables the screensaver on active output */
130136
void disable_screensaver_hotkey_handler(device_t *state, hid_keyboard_report_t *report) {
131-
_screensaver_set(state, false);
137+
_screensaver_set(state, DISABLED);
132138
}
133139

134140
/* Put the device into a special configuration mode */

src/include/main.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -206,9 +206,10 @@ enum screen_pos_e {
206206
};
207207

208208
enum screensaver_mode_e {
209-
DISABLED = 0,
210-
PONG = 1,
211-
JITTER = 2,
209+
DISABLED = 0,
210+
PONG = 1,
211+
JITTER = 2,
212+
MAX_SS_VAL = JITTER,
212213
};
213214

214215
#define ITF_NUM_HID 0

src/tasks.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -79,20 +79,21 @@ mouse_report_t *screensaver_pong(device_t *state) {
7979
mouse_report_t *screensaver_jitter(device_t *state) {
8080
const int16_t jitter_distance = 2;
8181
static mouse_report_t report = {
82-
.x = jitter_distance,
8382
.y = jitter_distance,
8483
.mode = RELATIVE,
8584
};
86-
87-
report.x = -report.x;
8885
report.y = -report.y;
8986

9087
return &report;
9188
}
9289

9390
/* Have something fun and entertaining when idle. */
9491
void screensaver_task(device_t *state) {
95-
const int mouse_move_delay = 5000;
92+
const uint32_t delays[] = {
93+
0, /* DISABLED, unused index 0 */
94+
5000, /* PONG, move mouse every 5 ms for a high framerate */
95+
10000000, /* JITTER, once every 10 sec is more than enough */
96+
};
9697
static int last_pointer_move = 0;
9798
screensaver_t *screensaver = &state->config.output[BOARD_ROLE].screensaver;
9899
uint64_t inactivity_period = time_us_64() - state->last_activity[BOARD_ROLE];
@@ -101,8 +102,8 @@ void screensaver_task(device_t *state) {
101102
if (screensaver->mode == DISABLED)
102103
return;
103104

104-
/* System is still not idle for long enough to activate or we've been running for too long */
105-
if (inactivity_period < screensaver->idle_time_us)
105+
/* System is still not idle for long enough to activate or screensaver mode is not supported */
106+
if (inactivity_period < screensaver->idle_time_us || screensaver->mode > MAX_SS_VAL)
106107
return;
107108

108109
/* We exceeded the maximum permitted screensaver runtime */
@@ -115,7 +116,7 @@ void screensaver_task(device_t *state) {
115116
return;
116117

117118
/* We're active! Now check if it's time to move the cursor yet. */
118-
if ((time_us_32()) - last_pointer_move < mouse_move_delay)
119+
if (time_us_32() - last_pointer_move < delays[screensaver->mode])
119120
return;
120121

121122
mouse_report_t *report;

0 commit comments

Comments
 (0)