mirror of
https://gitlab.freedesktop.org/wlroots/wlroots.git
synced 2025-10-29 05:40:12 -04:00
Use a set to track pointer button state.
In addition to `button_count`, we keep track of the current buttons pressed just as in `wlr_keyboard`. Add `set_add` and `set_remove` to assist with this. These functions can only be used with values greater than 0 (such as the button/key masks for keyboards and pointers). Partially addresses: - https://github.com/swaywm/wlroots/issues/1716 - https://github.com/swaywm/wlroots/issues/1593
This commit is contained in:
parent
b85f0cbff9
commit
06a13203dd
5 changed files with 75 additions and 31 deletions
32
util/array.c
32
util/array.c
|
|
@ -1,5 +1,5 @@
|
|||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include "util/array.h"
|
||||
#include <assert.h>
|
||||
|
||||
// https://www.geeksforgeeks.org/move-zeroes-end-array/
|
||||
size_t push_zeroes_to_end(uint32_t arr[], size_t n) {
|
||||
|
|
@ -19,3 +19,31 @@ size_t push_zeroes_to_end(uint32_t arr[], size_t n) {
|
|||
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool set_add(uint32_t values[], size_t *len, size_t cap, uint32_t target) {
|
||||
if (*len == cap) {
|
||||
return false;
|
||||
}
|
||||
assert(target > 0);
|
||||
for (uint32_t i = 0; i < *len; ++i) {
|
||||
if (values[i] == target) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
values[(*len)++] = target;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool set_remove(uint32_t values[], size_t *len, size_t cap, uint32_t target) {
|
||||
for (uint32_t i = 0; i < *len; ++i) {
|
||||
if (values[i] == target) {
|
||||
// Set to 0 and swap with the end element so that
|
||||
// zeroes exist only after all the values.
|
||||
size_t last_elem_pos = --(*len);
|
||||
values[i] = values[last_elem_pos];
|
||||
values[last_elem_pos] = 0;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue