aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--array.c20
-rw-r--r--array.h62
-rw-r--r--keyboard.c2
3 files changed, 57 insertions, 27 deletions
diff --git a/array.c b/array.c
index d863c59..bb8d522 100644
--- a/array.c
+++ b/array.c
@@ -40,16 +40,19 @@ void* array_add_(void* array, size_t item_size) {
info = realloc(info, sizeof(array_info) + (info->capacity * item_size));
}
info->size++;
- return &(info[1]);
+ return info->array;
}
-void array_resize(void* array, size_t size) {
- array_info* info = &((array_info*)array)[-1];
- info->size = size;
- if (size > info->capacity) {
+void* array_resize_(void* array, size_t item_size, size_t size) {
+ array_info* info = NULL;
+ if (!array) {
+ info = array_new_(item_size, 0);
+ }
+ else {
+ info = ((array_info*)array) - 1;
+ }
+ if (size >= info->capacity) {
info->capacity = size;
-
- // round up to next power of 2
info->capacity--;
info->capacity |= info->capacity >> 1;
info->capacity |= info->capacity >> 2;
@@ -57,7 +60,10 @@ void array_resize(void* array, size_t size) {
info->capacity |= info->capacity >> 8;
info->capacity |= info->capacity >> 16;
info->capacity++;
+ info = realloc(info, sizeof(array_info) + (info->capacity * item_size));
}
+ info->size = size;
+ return info->array;
}
void array_print(void* array) {
diff --git a/array.h b/array.h
index 3ea2057..5f2bff3 100644
--- a/array.h
+++ b/array.h
@@ -10,10 +10,10 @@ typedef struct {
} array_info;
array_info* array_new_(size_t item_size, size_t size);
-void array_resize(void* array, size_t size);
void array_print(void* array);
void array_pop(void* array);
void* array_add_(void* array, size_t item_size);
+void* array_resize_(void* array, size_t item_size, size_t size);
#define CONCAT_INNER(a, b) a ## b
#define CONCAT(a, b) CONCAT_INNER(a, b)
@@ -27,33 +27,55 @@ void* array_add_(void* array, size_t item_size);
(array) = NULL; \
} while (0)
-#define array_erase(array, index) do { \
- if ((index)) { \
- for (int __i = (index) - 1; __i < array_size((array)) - 1; __i++) \
- (array)[__i] = (array)[__i + 1]; \
- ((array_info*)(array))[-1].size--; \
- } \
+#define array_erase(array, index) do { \
+ if ((index)) { \
+ for (int __i = (index) - 1; __i < array_size((array)) - 1; __i++) \
+ (array)[__i] = (array)[__i + 1]; \
+ ((array_info*)(array))[-1].size--; \
+ } \
} while(0)
-#define array_insert(array, index, value) do { \
- void* __temp = array_add_((array), sizeof(*(array))); \
- (array) = __temp; \
- for (int __i = array_size((array)) - 1; __i > (index); __i--) \
- (array)[__i] = (array)[__i - 1]; \
- (array)[(index)] = value; \
-} while(0) \
+#define array_insert(array, index, value) do { \
+ void* __temp = array_resize_((array), sizeof(*(array)), array_size(array) + 1); \
+ (array) = __temp; \
+ for (int __i = array_size((array)) - 1; __i > (index); __i--) \
+ (array)[__i] = (array)[__i - 1]; \
+ (array)[(index)] = value; \
+} while(0)
+
+#define array_insert_many(array, index, values, len) do { \
+ void* __temp = array_resize_((array), sizeof(*(array)), array_size(array) + len); \
+ (array) = __temp; \
+ for (int __i = array_size((array)) - 1; __i > (index) + len; __i--) \
+ (array)[__i] = (array)[__i - len]; \
+ memcpy(&array[(index)], (values), len * sizeof(*(array))) \
+} while (0)
+
+#define array_insert_str(array, index, values) array_insert_many((array), (index), (values), strlen(values))
+#define array_add_many(array, index, values, len) do { \
+ void* __temp = array_resize_((array), sizeof(*(array)), array_size(array) + len); \
+ (array) = __temp; \
+ memcpy(&array[array_size((array)) - 1], (values), len * sizeof(*(array))) \
+} while (0)
+
+#define array_add_str(array, index, values) array_add_many((array), (index), (values), strlen(values))
+
+#define array_resize(array, size) do { \
+ void* __temp = array_resize_((array), sizeof(*(array)), size); \
+ (array) = __temp; \
+} while (0)
-#define array_add(array, value) do { \
- void* __temp = array_add_((array), sizeof(*(array))); \
- (array) = __temp; \
- (array)[array_size((array)) - 1] = value; \
+#define array_add(array, value) do { \
+ void* __temp = array_resize_((array), sizeof(*(array)), array_size(array) + 1); \
+ (array) = __temp; \
+ (array)[array_size((array)) - 1] = value; \
} while (0)
#define array_last(array) (array)[array_size(array) - 1]
-#define array_for_all(type__, name__, array__) \
-type__* CONCAT(it__, __LINE__) = array__; type__* CONCAT(end__, __LINE__) = array__ ? array__ + array_size(array__) : NULL; \
+#define array_for_all(type__, name__, array__) \
+type__* CONCAT(it__, __LINE__) = array__; type__* CONCAT(end__, __LINE__) = array__ ? array__ + array_size(array__) : NULL; \
for (type__* name__; (CONCAT(it__, __LINE__) < CONCAT(end__, __LINE__)) ? (name__ = CONCAT(it__, __LINE__), true) : false; CONCAT(it__, __LINE__)++)
#endif // ARRAY_H_
diff --git a/keyboard.c b/keyboard.c
index 710ec76..470fd11 100644
--- a/keyboard.c
+++ b/keyboard.c
@@ -126,6 +126,8 @@ void wl_keyboard_modifiers(void *data, struct wl_keyboard *wl_keyboard,
uint32_t group) {
client_state* state = data;
xkb_state_update_mask(state->xkb_state, mods_depressed, mods_latched, mods_locked, 0, 0, group);
+ struct itimerspec timer = {0};
+ timerfd_settime(state->key_repeat_timer_fd, 0, &timer, NULL);
}
void wl_keyboard_repeat_info(void *data, struct wl_keyboard *wl_keyboard,