@@ -69,6 +69,7 @@ typedef struct gesture_start {
6969typedef struct scroll_thread_params {
7070 uint8_t delta ;
7171 int code ;
72+ bool invert ;
7273 void (* callback )(input_event_array_t * );
7374} scroll_thread_params_t ;
7475
@@ -222,10 +223,10 @@ static void set_input_event(struct input_event *input_event, int type, int code,
222223#define set_key_event (key_event , code , value ) set_input_event(key_event, EV_KEY, code, value)
223224#define set_rel_event (rel_event , code , value ) set_input_event(rel_event, EV_REL, code, value)
224225
225- static input_event_array_t * do_scroll (double distance , int32_t delta , int rel_code ) {
226+ static input_event_array_t * do_scroll (double distance , int32_t delta , int rel_code , bool invert ) {
226227 input_event_array_t * result = NULL ;
227228 // increment the scroll width by the current moved distance
228- scroll .width += distance ;
229+ scroll .width += distance * ( invert ? -1 : 1 ) ;
229230 // a scroll width of delta means scroll one "scroll-unit" therefore a scroll event
230231 // can be first triggered if the absolute value of scroll.width exeeded delta
231232 if (fabs (scroll .width ) > fabs (delta )) {
@@ -240,7 +241,7 @@ static input_event_array_t *do_scroll(double distance, int32_t delta, int rel_co
240241
241242static input_event_array_t * do_zoom (double distance , int32_t delta ) {
242243 input_event_array_t * result = NULL ;
243- input_event_array_t * tmp = do_scroll (distance , delta , REL_WHEEL );
244+ input_event_array_t * tmp = do_scroll (distance , delta , REL_WHEEL , false );
244245 if (tmp ) {
245246 result = new_input_event_array (6 );
246247 // press CTRL
@@ -368,7 +369,7 @@ static input_event_array_t *process_syn_event(struct input_event event,
368369 direction = RIGHT ;
369370 }
370371 } else if (current_gesture == SCROLL ) {
371- result = do_scroll (mt_slots .last_points [0 ].x - mt_slots .points [0 ].x , config .scroll .horz_delta , REL_HWHEEL );
372+ result = do_scroll (mt_slots .last_points [0 ].x - mt_slots .points [0 ].x , config .scroll .horz_delta , REL_HWHEEL , config . scroll . invert_horz );
372373 }
373374 } else {
374375 if (current_gesture == NO_GESTURE ) {
@@ -382,7 +383,7 @@ static input_event_array_t *process_syn_event(struct input_event event,
382383 direction = DOWN ;
383384 }
384385 } else if (current_gesture == SCROLL ) {
385- result = do_scroll (mt_slots .points [0 ].y - mt_slots .last_points [0 ].y , config .scroll .vert_delta , REL_WHEEL );
386+ result = do_scroll (mt_slots .points [0 ].y - mt_slots .last_points [0 ].y , config .scroll .vert_delta , REL_WHEEL , config . scroll . invert_vert );
386387 }
387388 }
388389 }
@@ -433,7 +434,7 @@ static int32_t get_axix_offset(int fd, int axis) {
433434 .tv_nsec = 5000000 \
434435 };\
435436 nanosleep(&tim, NULL); \
436- input_event_array_t *events = do_scroll(velocity * 5, thread_params->delta, thread_params->code); \
437+ input_event_array_t *events = do_scroll(velocity * 5, thread_params->delta, thread_params->code, thread_params->invert ); \
437438 if (events) { \
438439 thread_params->callback(events); \
439440 } \
@@ -505,10 +506,12 @@ void process_events(int fd, configuration_t config, void (*callback)(input_event
505506 if (fabs (scroll .x_velocity * config .scroll .horz_delta ) > fabs (scroll .y_velocity * config .scroll .vert_delta )) {
506507 params .delta = config .scroll .horz_delta ;
507508 params .code = REL_HWHEEL ;
509+ params .invert = config .scroll .invert_horz ;
508510 scroll .y_velocity = 0 ;
509511 } else {
510512 params .delta = config .scroll .vert_delta ;
511513 params .code = REL_WHEEL ;
514+ params .invert = config .scroll .invert_vert ;
512515 scroll .x_velocity = 0 ;
513516 }
514517 pthread_create (& scroll_thread , NULL , & scroll_thread_function , (void * ) & params );
0 commit comments