diff options
Diffstat (limited to 'swaybar')
-rw-r--r-- | swaybar/event_loop.c | 37 |
1 files changed, 23 insertions, 14 deletions
diff --git a/swaybar/event_loop.c b/swaybar/event_loop.c index 1e0d426b..bc4053be 100644 --- a/swaybar/event_loop.c +++ b/swaybar/event_loop.c | |||
@@ -72,24 +72,18 @@ void add_event(int fd, short mask, | |||
72 | } | 72 | } |
73 | 73 | ||
74 | bool remove_event(int fd) { | 74 | bool remove_event(int fd) { |
75 | int index = -1; | 75 | /* |
76 | * Instead of removing events immediately, we mark them for deletion | ||
77 | * and clean them up later. This is so we can call remove_event inside | ||
78 | * an event callback safely. | ||
79 | */ | ||
76 | for (int i = 0; i < event_loop.fds.length; ++i) { | 80 | for (int i = 0; i < event_loop.fds.length; ++i) { |
77 | if (event_loop.fds.items[i].fd == fd) { | 81 | if (event_loop.fds.items[i].fd == fd) { |
78 | index = i; | 82 | event_loop.fds.items[i].fd = -1; |
83 | return true; | ||
79 | } | 84 | } |
80 | } | 85 | } |
81 | if (index != -1) { | 86 | return false; |
82 | free(event_loop.items->items[index]); | ||
83 | |||
84 | --event_loop.fds.length; | ||
85 | memmove(&event_loop.fds.items[index], &event_loop.fds.items[index + 1], | ||
86 | sizeof(struct pollfd) * event_loop.fds.length - index); | ||
87 | |||
88 | list_del(event_loop.items, index); | ||
89 | return true; | ||
90 | } else { | ||
91 | return false; | ||
92 | } | ||
93 | } | 87 | } |
94 | 88 | ||
95 | static int timer_item_timer_cmp(const void *_timer_item, const void *_timer) { | 89 | static int timer_item_timer_cmp(const void *_timer_item, const void *_timer) { |
@@ -126,6 +120,21 @@ void event_loop_poll() { | |||
126 | } | 120 | } |
127 | } | 121 | } |
128 | 122 | ||
123 | // Cleanup removed events | ||
124 | int end = 0; | ||
125 | int length = event_loop.fds.length; | ||
126 | for (int i = 0; i < length; ++i) { | ||
127 | if (event_loop.fds.items[i].fd == -1) { | ||
128 | free(event_loop.items->items[i]); | ||
129 | list_del(event_loop.items, i); | ||
130 | --event_loop.fds.length; | ||
131 | } else if (end != i) { | ||
132 | event_loop.fds.items[end++] = event_loop.fds.items[i]; | ||
133 | } else { | ||
134 | end = i + 1; | ||
135 | } | ||
136 | } | ||
137 | |||
129 | // check timers | 138 | // check timers |
130 | // not tested, but seems to work | 139 | // not tested, but seems to work |
131 | for (int i = 0; i < event_loop.timers->length; ++i) { | 140 | for (int i = 0; i < event_loop.timers->length; ++i) { |