queues: correctly sort notifications even when sort is false.

The sort name is a bit misleading. It should actually be called
sort_urgency or something.
Notifications are still not sorted based on time, but ID.
This commit is contained in:
fwsmit 2021-03-10 23:27:11 +01:00
parent 3acffdb194
commit b75d35adb4
2 changed files with 64 additions and 3 deletions

View File

@ -192,7 +192,7 @@ const char *notification_urgency_to_string(const enum urgency urgency)
/* see notification.h */ /* see notification.h */
int notification_cmp(const struct notification *a, const struct notification *b) int notification_cmp(const struct notification *a, const struct notification *b)
{ {
if (a->urgency != b->urgency) { if (settings.sort && a->urgency != b->urgency) {
return b->urgency - a->urgency; return b->urgency - a->urgency;
} else { } else {
return a->id - b->id; return a->id - b->id;
@ -205,8 +205,6 @@ int notification_cmp_data(const void *va, const void *vb, void *data)
struct notification *a = (struct notification *) va; struct notification *a = (struct notification *) va;
struct notification *b = (struct notification *) vb; struct notification *b = (struct notification *) vb;
ASSERT_OR_RET(settings.sort, 1);
return notification_cmp(a, b); return notification_cmp(a, b);
} }

View File

@ -763,6 +763,68 @@ TEST test_queue_find_by_id(void)
PASS(); PASS();
} }
void print_queues() {
printf("\nQueues:\n");
for (GList *iter = g_queue_peek_head_link(QUEUE_WAIT); iter;
iter = iter->next) {
struct notification *notif = iter->data;
printf("waiting %s\n", notif->summary);
}
}
// Test if notifications are correctly sorted, even if dunst is paused in
// between. See #838 for the issue.
TEST test_queue_no_sort_and_pause(void)
{
// Setting sort to false, this means that notifications will only be
// sorted based on time
settings.sort = false;
settings.geometry.h = 0;
struct notification *n;
queues_init();
n = test_notification("n0", 0);
queues_notification_insert(n);
queues_update(STATUS_NORMAL);
n = test_notification("n1", 0);
queues_notification_insert(n);
queues_update(STATUS_NORMAL);
n = test_notification("n2", 0);
queues_notification_insert(n);
queues_update(STATUS_PAUSE);
n = test_notification("n3", 0);
queues_notification_insert(n);
queues_update(STATUS_PAUSE);
/* queues_update(STATUS_NORMAL); */
n = test_notification("n4", 0);
queues_notification_insert(n);
queues_update(STATUS_NORMAL);
QUEUE_LEN_ALL(0, 5, 0);
const char* order[] = {
"n0",
"n1",
"n2",
"n3",
"n4",
};
for (int i = 0; i < g_queue_get_length(QUEUE_DISP); i++) {
struct notification *notif = g_queue_peek_nth(QUEUE_DISP, i);
ASSERTm("Notifications are not in the right order",
STR_EQ(notif->summary, order[i]));
}
queues_teardown();
PASS();
}
SUITE(suite_queues) SUITE(suite_queues)
{ {
settings.icon_path = ""; settings.icon_path = "";
@ -794,6 +856,7 @@ SUITE(suite_queues)
RUN_TEST(test_queues_update_xmore); RUN_TEST(test_queues_update_xmore);
RUN_TEST(test_queues_timeout_before_paused); RUN_TEST(test_queues_timeout_before_paused);
RUN_TEST(test_queue_find_by_id); RUN_TEST(test_queue_find_by_id);
RUN_TEST(test_queue_no_sort_and_pause);
settings.icon_path = NULL; settings.icon_path = NULL;
} }